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不同:

  • 它有一个不同的历史:B而不是a
  • 其内容说明了B和C的变化;它与合并示例中的M相同 请注意,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