4

我是 Git 新手,需要帮助理解 Git 历史图表,即提交和合并之间的关系,因为它们在 SmartGit 或 GitGui 等工具的图表上显示。在下图中,红色提交之间的关系是什么,特别是“IA-481”和“合并分支IA-481(Release2)......”我主要是因为“IA-481”打算去在一个名为“IA-481(Release2)”的分支中,而不是在 Master 中。

所以这里有一些更详细的信息:

  1. 我最初在一个名为“IA-481(Release)”的分支中签入了我的文件。
  2. 然后我切换到Master,从Master Branch调用merge,将“IA-481(Release)”中的文件与Master合并。我又做了一些更改,但意识到现在提交给 Master 还为时过早,所以我没有提交给 Master。
  3. 相反,我创建并切换到另一个名为“IA-481(Release2)”的新分支,并将合并的文件提交到第二个新分支(而不是 Master)。
  4. 其他人切换到 IA-481(Release2) 分支来检查我的工作,并进行了一些检查。

后来我们发现我最初对“IA-481(Release2)”分支所做的 IA-481 提交不知何故在主分支中结束了。我正试图弄清楚它是如何到达那里的。是另一个人将它与 Master 合并的名为“Merge branch IA-481(Release2)”的提交,还是在我的 IA-481 签入时已经在 Master 中。在哪个提交出现问题?

4

5 回答 5

1

IA-481 是在与 master 不同的分支上的提交。然后在您突出显示的合并提交处将该分支合并到 master 中。

于 2013-05-03T09:59:41.633 回答
1

提交引入了变化。当在同一个分支上一个接一个地提交时(正常情况),更改是累积的。创建分支时,在一个分支中所做的更改不会出现在其他分支中。需要合并来合并独立的更改。

考虑以下简单的历史。提交修改单个文件。每次提交后的文件内容以双引号显示。commit 0是第一次commit,commits 1到4加上他们commit number的英文名,commit 5合并commits 3和4引入的变化。

*   commit 5: "one two three four"
|\  Merge: 3 4
| | 
| |   
| * commit 4 "one two four"
| | 
| |   
* | commit 3 "one two three"
|/   
|  
* commit 2: "one two"
| 
|  
* commit 1: "one"
| 
|  
* commit 0: ""

提交 4 是在不同的分支上进行的。它对应于提交 IA-481。大概这个提交引入了一些更改,并且在提交“Merge branch IA-481(Release2)....”中,这些更改已集成到主分支中。这是处理多个事情时的正常工作流程:分支,提交更改,然后将它们合并到主分支中。如果没有合并,更改只会位于单独的分支中并且不执行任何操作。

于 2013-05-03T10:15:42.777 回答
0

其他答案似乎冗长。

从另一个分支合并会带来来自该分支的更改。您似乎认为您必须合并,然后提交合并。这是不正确的——合并本身一个提交,它引入了来自另一个分支的更改。

编辑:@tom 是正确的。如果存在合并冲突,您必须在将冲突标记为已解决后主动提交合并。

于 2013-05-03T22:51:34.100 回答
0

这些图表很容易解释。不同的提交是点,所以如果你只是改变一些东西并进行提交,你会得到另一个连接到前一个提交的小点。

如果您进行分支,则可以将多个点连接到上一个提交。

如果您合并多个先前的提交将连接到您的新点。

所以 IA-481 是在与 master 不同的分支上的提交(但它是按时间顺序排序的,这就是为什么它显示在 IA-1617 和 IA-1617 之间的原因,它们是 master 上的提交),并且它在您的第二次合并到 master 分支从底部突出显示。

您最后一个突出显示的点是另一个合并,但这次是远程分支。

还有什么不清楚的吗?

于 2013-05-03T10:05:21.787 回答
0

你试过@gary提到的吗?我觉得您可能错过了很多评论,但这应该根据您的问题和评论有所帮助。

链接到 git log:git log 手册页

--diff-filter=[(A|C|D|M|R|T|U|X|B)…[*]] 
Select only files that are Added (A), Copied (C), Deleted (D), Modified (M), Renamed (R), have   their type (i.e. regular file,
symlink, submodule, …) changed (T), are Unmerged (U), are Unknown   (X), or have had their pairing Broken (B). Any combination 
of the filter characters (including none)   can be used. When * (All-or-none) is added to the combination, all paths are 
selected if   there is any file that matches other criteria in the comparison; if there is no file that matches   other 
criteria, nothing is selected. 

所以这个命令会告诉你添加 newAddedFile.c 文件的提交

git log --diff-filter=A -- newAddedFile.c

于 2013-05-10T00:09:39.513 回答