不知何故,我的主分支和我的起源/主分支分道扬镳了。 我不希望它们发散。

我如何看待这些差异并将其合并?


当前回答

我相信这应该对我有帮助:

git reset --hard origin/master

但事实并非如此。不知怎的,我得到了同样的消息&当我从远程分支中提取更改时,冲突就发生了。因为我确定我根本不需要我现有的本地分支&我只需要一个远程主分支的副本,因此我想出了这个解决方案:

签出到一个新的分支,例如,git Checkout -b placeholder-branch。注意:该分支可以稍后删除。 git分支-D master,我这样做是因为我确定我的本地分支被搞砸了&我不需要这个。我需要远程实例的新副本。 Git签出-跟踪原点/master &你完成了;现在你可以使用git branch -D删除占位符分支

其他回答

我知道这里有很多答案,但我认为git reset -soft HEAD~1值得注意,因为它让你在解决发散状态时,在最后一次本地(未推送)提交中保留更改。我认为这是一个比使用rebase的pull更通用的解决方案,因为本地提交可以被审查,甚至可以移动到另一个分支。

关键是使用——柔和,而不是严厉——强硬。如果提交次数超过1次,则更改HEAD~x应该可以工作。这里是解决我的情况的所有步骤(我有1个本地提交和8个远程提交):

1) git reset—soft HEAD~1来撤销本地提交。对于接下来的步骤,我使用了SourceTree中的接口,但我认为以下命令也可以工作:

2) git从1)到stash的变化。现在所有的变化都是安全的,不再有分歧。

3) git拉取远程更改。

4) git stash pop或git stash apply应用上次存储的更改,如果需要,随后是一个新的提交。当想要丢弃本地提交中的更改时,这一步是可选的,还有2)。另外,当想要提交到另一个分支时,这一步应该在切换到所需的分支后完成。

你可以用a来查看它们的区别:

git log HEAD..origin/main

# old repositories
git log HEAD..origin/master

(请参见“如何让git总是从特定的分支中提取?”)

注意:从Git 2.28 (Q3 2020)开始,默认的分支是可配置的,现在(2021+)设置为main,不再是master。 其余的答案反映了最近的习俗。


当你有这样的信息:

“你的分支和‘origin/main’已经分开了,#和分别有1个和1个不同的提交。”

检查是否需要更新原点。 如果origin是最新的,那么当您在本地进行自己的提交时,一些提交已经从另一个repo推送到origin。

... o ---- o ---- A ---- B  origin/main (upstream work)
                   \
                    C  main(your work)

您基于提交A提交C,因为这是您当时从上游获取的最新工作。

但是,在您试图推回原点之前,其他人推了提交B。 发展的历史已经分化成不同的道路。

然后,您可以合并或重新编制数据库。详见Pro Git: Git分支-重基。

使用git merge命令:

$ git merge origin/main

# old repositories
$ git merge origin/master

这告诉Git将来自origin/main的更改集成到您的工作中,并创建一个合并提交。 现在的历史图表是这样的:

... o ---- o ---- A ---- B  origin/main (upstream work)
                   \      \
                    C ---- M  main (your work)

新的合并(commit M)有两个父节点,每个父节点代表一条通向该提交中存储的内容的开发路径。

注意,M背后的历史现在是非线性的。

变基

使用git rebase命令:

$ git rebase origin/main

# old repositories
$ git rebase origin/master

这告诉Git重播提交C(你的工作),就好像你是基于提交B而不是A。 CVS和Subversion用户在提交前更新时,通常会在上游工作的基础上重新构建本地更改。 Git只是在提交和重基步骤之间增加了显式的分隔。

现在的历史图表是这样的:

... o ---- o ---- A ---- B  origin/main (upstream work)
                          \
                           C'  main (your work)

Commit C'是git rebase命令创建的一个新提交。 它与C有两个不同之处:

它有着不同的历史:B而不是a。 它的内容解释了B和C的变化;它与合并示例中的M相同。

请注意,C'背后的历史仍然是线性的。 我们选择(目前)只允许cmake.org/cmake.git中的线性历史。 这种方法保留了以前使用的基于cvs的工作流,并且可以简化转换。 尝试将C'推入我们的存储库将会工作(假设您有权限,并且在您重基时没有人推过)。

git pull命令提供了一种简单的方法来从原点获取并在其上重新设置本地工作:

$ git pull --rebase

这将上面的获取和rebase步骤合并到一个命令中。

当我基于分支a创建一个分支时遇到了这个问题

git checkout -b a

然后我将分支a的起始流设置为分支B的原点

git branch -u origin/B

然后我得到了上面的错误消息。

对我来说,解决这个问题的一个方法是,

删除分支a 创建一个新的分支b

git checkout -b b origin/B

在我的情况下,我得到这个消息时,我按X。1从分支B提交到它的远程跟踪分支remote_B。然后在我的本地存储库,我做了更改,并将其修改为相同的提交ie。X ver.2。

现在我们在远程repo上提交xver1,并提交xver。2在本地。 然后git会警告你

您的本地分支和remote_分别有1个和1个不同的提交

要解决这个问题,你有两个选择:

1.从远程跟踪分支提取变更。

git reset --hard HEAD
git checkout --track remoteRepoName/branch_name 

2.强制将修改后的提交推到远程回购。 (仅建议在推X ver1提交后远程回购没有被任何人拉)

git push -f remote_repo_name remote_branch_name

我相信这应该对我有帮助:

git reset --hard origin/master

但事实并非如此。不知怎的,我得到了同样的消息&当我从远程分支中提取更改时,冲突就发生了。因为我确定我根本不需要我现有的本地分支&我只需要一个远程主分支的副本,因此我想出了这个解决方案:

签出到一个新的分支,例如,git Checkout -b placeholder-branch。注意:该分支可以稍后删除。 git分支-D master,我这样做是因为我确定我的本地分支被搞砸了&我不需要这个。我需要远程实例的新副本。 Git签出-跟踪原点/master &你完成了;现在你可以使用git branch -D删除占位符分支