我选择了主分支,进行了代码更改,添加了几个文件,在本地暂存并提交了所有内容。将主推到远程时,它给了我一个错误,不允许推送到主站。我知道我实际上应该使用新的功能分支而不是主分支。
现在我已经在远程的主分支上创建了一个新的功能分支,在本地连接到功能分支,不确定如何在功能分支上进行相同的提交?
我能想到的一个解决方案是 -连接到进行更改的本地主节点。复制文件夹中的所有文件并将其保存在 git 文件夹之外。然后连接到功能分支并将复制的文件粘贴,暂存、提交并推送到远程功能分支。然后,引发拉取请求以将功能分支合并到主分支中。
另一种解决方案是在本地创建 master 的新功能分支。然后将其推送到服务器并在服务器上提出拉取请求以合并到 master 中。但是我的本地主服务器和服务器主服务器将不同步,一旦合并完成,我将不得不删除本地文件夹并再次克隆它以将本地主服务器与服务器主服务器匹配。
除了上面提到的方式之外,还有其他优雅的方式吗?
虽然您提出的方法(或使用 UI 工具(可能更容易,但您当然可以通过命令行来完成。 由于您已经提交了更改,因此无法存储它们,但是您可以简单地将更改转移到新分支。
TL;博士
- 获取主服务器上不是本地更改的最新提交的哈希(即通过
git log
- 从该提交创建新分支 (
git checkout -b feature <hash>
( - 从主节点重定本地提交基数 (
git rebase master
( - 推送新分支 (
git push origin feature
( - 将主服务器重置为旧提交 (
git reset --hard <hash>
(
长版+解释
首先,您需要功能分支中不需要的最新提交的哈希。假设这是来自远程的最新提交,origin/master
您只需在
git log
当前树:
master
|
A---B---C---D---E
|
origin/master
接下来,您必须从该提交创建一个分支:
git checkout -b feature <hash>
当前树:
feature master
| |
A---B---C---D---E
|
origin/master
现在,您在该位置有一个名为feature
的新分支,您应该更早地在其中创建它。接下来,您只需从该点之后从master
获取所有提交并将它们放入feature
。如果您不希望master
中的所有提交都包含在feature
中,您可以使用第二个命令进行挑选。
git rebase master
git rebase -i
当前树:
master,feature
|
A---B---C---D---E
|
origin/master
此时,您可以将新分支推送到源并引发 PR,但您仍然必须从主节点中删除这些提交,否则稍后从origin/master
中提取时可能会遇到问题:
git checkout master
git reset --hard <hash>
当前树:
master feature
| |
A---B---C---D---E
|
origin/master
现在,您可以推送、拉动和引发 PR,就像您从一开始就对新分支进行了所有更改一样。
我认为最优雅的方法是使用git cherry-pick
。现在 git 樱桃采摘是如何工作的。此命令实际执行的操作是从一个分支复制提交并将其粘贴到另一个分支。实际的命令是git cherry-pick commitSha
其中 commitSha 是提交的哈希值,您可以使用 git log 找到它。因此,找到提交的 sha,在要应用提交的新分支中签出,然后执行上述命令。然后,当您完成新分支时,您可以将主分支git reset
到您之前的提交。