根据Git,谁是“我们”谁是“他们”?

时间:2014-01-09 16:09:14

标签: git

在Git rebase之后,在其他情况下,您可以在git status报告中找到一些标记为我们已删除的文件。根据Git,我们是谁?为什么?

它指的是我坐在这个分支上它是否适合我?或者它是指自己和那些在分支机构上工作的人我正在反对?

2 个答案:

答案 0 :(得分:154)

当您合并时,us指的是您要合并的分支,而不是them,即要合并的分支。

rebase 时,us引用上游分支,而them是您正在移动的分支。如果发生变革,这有点违反直觉。

原因是Git使用相同的合并引擎进行rebase,它实际上是将你的东西挑选到上游分支中。 us = into,them =来自。

答案 1 :(得分:6)

在所有情况下:

  1. “我们” =当前已检出的提交(HEAD git进行操作时会引起冲突(稍后会详细介绍) ),以及:
  2. “他们” =另一个提交,在git执行导致冲突的操作时,尚未由git 检出(稍后会详细介绍)。 / li>

要点:HEAD时,它引起冲突的动作不一定是HEAD,而在您键入git命令时。这是必须理解的。 Git可能会进行一些检出操作,并在运行导致冲突的操作之前更改HEAD(检出提交),从而导致“ us”和“ them”出现互换或向后移到未经训练的眼睛。 / em>

这4种情况,详细说明:合并,cherry-pick,rebase,revert:

  1. git merge(直观):
    1. 示例命令:

       git checkout master
       git merge feature_branch  # merge feature_branch into master
      
    2. “我们” = HEAD = master,因为您在运行{{1}时位于分支master上}。

    3. “他们” = git merge feature_branch,这是您要合并到feature_branch的分支。

  2. master(直观):
    1. 示例命令:

      git cherry-pick
    2. “我们” = git checkout feature_branch git cherry-pick some_commit # apply some_commit to feature_branch = HEAD,因为您在运行{{1}时位于分支feature_branch上}。

    3. “他们” = feature_branch,这是您正在挑选到git cherry-pick some_commit上的提交。

  3. some_commit(违反直觉的方法,但是一旦您了解其工作原理便完全有意义):
    1. 示例命令:

      feature_branch
    2. “我们” = git rebase,它是上游分支: git checkout feature_branch git rebase master # rebase feature_branch onto latest master HEAD提交中的某些提交历史记录和master 上的提交哈希之前(这很棘手!)。这是因为,当您键入master时, git首先会检出合并基础分支(该分支对mastergit rebase master都是通用的被feature_branch找到),然后从master一次一次开始在该合并基础上挑选樱桃提交,从而将git merge-base master feature_branch重新定为最新的feature_branch。因此,“我们” = feature_branch,但是由于git在后台进行了新的签出操作以执行此变基,因此master并不是您所在的分支输入HEAD。相反,我们HEAD是一些基于合并的提交,在该点发生冲突,而他们是另一个提交,这是来自git rebase master,将按顺序应用于此新HEAD

    3. “他们” =来自feature_branch的一些提交,该提交将应用于新签出的HEAD,其中feature_branchHEAD进行重新设置期间的第一个Cherry-pick操作的结果,或者将这些新创建的提交之一合并到此合并基础之上,因为HEAD被“重新设置”,或被选择一次一次提交到通用的基于合并的提交。参见上方的“我们”的说明。

  4. git merge-base master feature_branch(有点直观,但我仍在努力解决这一问题):
    1. 示例命令:

      feature_branch
    2. 由于我不知道git revert是如何在后台运行的,因此我仍在努力解决这一问题。如果您有见识,请在or as an answer here处将其添加为评论。

    3. “我们” = git checkout feature_branch # create a new commit to undo the changes from some_previous_commit # within feature_branch git revert some_previous_commit = git revert,因为您在运行{{1}时位于分支HEAD上}。

    4. “它们” =(相反或相反?)feature_branch,这是您要还原其更改的提交(通过在其上创建新的提交来撤消) feature_branch的顶部)。换句话说,“他们”似乎是git创建的一些短暂提交,与git revert some_previous_commit 相反,以撤消some_previous_commit的更改。

参考文献:

  1. [我对feature_branch] Who is `them` and `us` in a `git revert`?期间“他们”和“我们”的含义的回答
  2. [@ LeGEC的答案指出,“我们/我们”始终是some_previous_commit,而“他们/他们”始终是另一个分支或提交)Who is `them` and `us` in a `git revert`?
  3. [关于我对some_previous_commitgit revert的理解,我反复核对的先前存在的答案] Who is "us" and who is "them" according to Git?

其他研究:

  1. [我需要研究这个答案!] Who is `them` and `us` in a `git revert`?