Git 主分行和';原点/主控';有分歧,如何';无边界';分支机构';?
不知何故,我的Git 主分行和';原点/主控';有分歧,如何';无边界';分支机构';?,git,branch,Git,Branch,不知何故,我的master和我的origin/master分支出现了分歧。 我其实不想让他们分道扬镳 如何查看这些差异并将其合并?您可以使用: 之前(提取+合并)(另请参见) 当您收到如下消息时: “您的分支和“源/主”已分离,#分别有1个和1个不同的提交。” ,请检查您是否需要。如果origin是最新的,则当您在本地进行自己的提交时,一些提交已从另一个回购推送到origin ... o ---- o ---- A ---- B origin/master (upstream work)
master
和我的origin/master
分支出现了分歧。我其实不想让他们分道扬镳 如何查看这些差异并将其合并?您可以使用: 之前(提取+合并)(另请参见)
当您收到如下消息时: “您的分支和“源/主”已分离,#分别有1个和1个不同的提交。” ,请检查您是否需要。如果
origin
是最新的,则当您在本地进行自己的提交时,一些提交已从另一个回购推送到origin
... o ---- o ---- A ---- B origin/master (upstream work)
\
C master (your work)
您将commit C基于commit A,因为这是您当时从上游获取的最新工作
但是,在您尝试推回原点之前,其他人推送了提交B。发展历史已经分道扬镳 然后可以合并或重新设置基础。有关详细信息,请参阅 合并 使用git merge命令:
$ git merge origin/master
$ git rebase origin/master
这告诉Git将来自origin/master
的更改集成到您的工作中,并创建一个合并提交。历史图表现在如下所示:
... o ---- o ---- A ---- B origin/master (upstream work)
\ \
C ---- M master (your work)
新的合并commit M有两个父级,每个父级代表一条开发路径,该路径导致提交中存储的内容
请注意,M背后的历史现在是非线性的
重新设置基础
使用git rebase命令:
$ git merge origin/master
$ git rebase origin/master
这告诉Git重放提交C(您的工作),就好像您基于提交B而不是提交A一样。CVS和Subversion用户在提交前进行更新时,通常会在上游工作的基础上重新确定其本地更改的基础。
Git只是在提交和重新基址步骤之间添加了显式分隔 历史图表现在如下所示:
... o ---- o ---- A ---- B origin/master (upstream work)
\
C' master (your work)
Commit C'是由git-rebase命令创建的新提交。它在两个方面与C不同:
我们(目前)选择在
cmake.org/cmake.git
中只允许线性历史此方法保留了以前使用的基于CVS的工作流,并可能简化转换。
尝试将C'推送到我们的存储库将起作用(假设您拥有权限,并且在您重新设置基址时没有人推过) git pull命令提供了一种从源站获取并重新设置本地工作基础的快捷方式:
$ git pull --rebase
这将上述获取和重设基础步骤合并到一个命令中 即使在阅读了上述回复后,我也感到困惑,不知道是什么导致了这一现象。我的解决办法是
git reset --hard origin/master
然后,这只会将我的(本地)母版副本(我假设它出错)重置到正确的点,如(远程)origin/master所示
git reset --hard commit_sha
警告:您将丢失所有尚未推送到源站/主站的更改
是一个单一的命令,可以帮助您的大部分时间
编辑:从源/主节点提取提交,并将您的更改应用于新提取的分支历史记录。在我的例子中,我是这样做的,以导致出现分歧的消息:我做了
git push
,但随后做了git commit--amend
以向提交消息添加内容。然后我又做了另一件事
所以在我的例子中,这仅仅意味着origin/master已经过时了。因为我知道没有其他人在接触origin/master,所以修复非常简单:
git push-f
(其中-f
表示强制)当我尝试重新设置跟踪远程分支的分支的基址时,我发现自己处于这种情况,并且我尝试在master上重新设置它的基址。在这个场景中,如果您尝试重新设置基址,您很可能会发现您的分支发散了,这可能会造成git nubees无法处理的混乱
假设您在分支my_remote_tracking_分支上,它是从master分支而来的
$git状态
#在分支上我的分支\u远程\u跟踪\u分支
没有要提交的内容(工作目录清理)
现在,您正尝试从master重新设置基址为:
git重基主控器
现在停下来,省省点麻烦吧!相反,请将“合并”用作:
git合并主机
是的,您的分支将有额外的提交。但是,除非您准备使用“无分歧”分支,否则这将是一个比重定基址更平滑的工作流。有关更详细的说明,请参阅
另一方面,如果您的分支只是一个本地分支(即,尚未推送到任何远程分支),那么您肯定应该执行rebase(在这种情况下,您的分支不会发散)
现在,如果您阅读本文是因为您已经处于由于这种重新基而导致的“发散”场景中,那么您可以通过使用以下命令从原点返回到最后一次提交(即,处于未发散状态):
git重置--硬原点/我的远程跟踪分支
在我的情况下,这是因为我没有承诺解决冲突 该问题是由运行
git pull
命令引起的。原产地的变化导致与我的本地回购协议发生冲突,我解决了这一问题。然而,我没有作出承诺。此时的解决方案是提交更改(git commit
已解析的文件)
如果在解决冲突后还修改了某些文件,则
git status
命令将本地修改显示为未分级的本地修改,并将合并解决显示为分级的本地修改。这可以通过以下方式正确解决:首先通过git commit
提交合并中的更改,然后像往常一样添加并提交未过时的更改(例如通过git commit-a
) 在我的例子中,我将更改推到了origin/master
,然后意识到我不应该这样做:-(由于本地更改位于子树中,这一点很复杂。所以我去了
git checkout -b a
git branch -u origin/B
git checkout -b b origin/B
git reset HEAD~123 && git reset && git checkout . && git clean -fd && git pull
This way you will not loose your local changes
# copying your commit(s) to separate branch
git checkout <last_sync_commit>
git checkout -b temp
git cherry-pick <last_local_commit>
git checkout master
git reset --soft HEAD~1 # or how many commits you have only on local machine
git stash # safer, can be avoided using hard resetting on the above line
git pull
git cherry-pick <last_local_commit>
# deleting temporary branch
git branch -D temp
git reset --hard commit_sha