不知何故,我的主分支和我的起源/主分支分道扬镳了。 我不希望它们发散。
我如何看待这些差异并将其合并?
不知何故,我的主分支和我的起源/主分支分道扬镳了。 我不希望它们发散。
我如何看待这些差异并将其合并?
当前回答
git pull --rebase origin/master
是一个在大多数情况下可以帮助您的命令。
编辑:从源/主节点中提取提交,并将您的更改应用于新提取的分支历史记录。
其他回答
在我的情况下,我已经将更改推到origin/master,然后意识到我不应该这样做:-(这是复杂的事实,局部更改是在子树中。所以我回到了“坏的”本地更改之前的最后一个好的提交(使用SourceTree),然后我得到了“分歧消息”。
在本地修复了我的混乱之后(细节在这里不重要),我想“回到”远程源/主分支,这样它就会再次与本地主同步。我的解决方案是:
git push origin master -f
注意-f (force)开关。这删除了错误地推送到origin/master的“坏更改”,现在本地和远程分支是同步的。
请记住,这是一个潜在的破坏性操作,因此只有在您100%确定及时“移回”远程主机是OK的情况下才执行该操作。
你可以用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步骤合并到一个命令中。
我已经通过移动到commit_sha来修复它,最后提交给origin/master。
git reset --hard commit_sha
警告:在commit 'commit_sha' commit之后,你将丢失所有提交的内容。
Git重置——soft origin/my_remote_tracking_branch
This way you will not loose your local changes
以我为例,这是因为我没有解决冲突。
该问题是由运行git pull命令引起的。原产地的变化导致与我的本地回购发生冲突,我解决了这个问题。然而,我并没有犯下这些罪行。此时的解决方案是提交更改(git提交已解析的文件)
如果在解决冲突后还修改了一些文件,git status命令将把本地修改显示为非分段本地修改,并将合并解析显示为分段本地修改。这个问题可以通过git commit从merge中提交更改来解决,然后像往常一样添加并提交未分阶段的更改(例如通过git commit -a)。