git 合并是添加所有提交还是仅添加最后一次提交?

Does git merge add all commits or only last commit?

所以我一直在使用 git 合并,我不明白它是从合并分支添加所有提交还是只添加最后一个提交

如果我有一个分支 A 和一个分支 B

所以,如果我 git 将 B 合并到分支 A

会发生什么

如果我 git 将 A 合并到分支 B

会发生什么

我最想知道的是合并完成后会发生什么,是所有提交都添加到当前分支还是只添加到最后一个

我是 git 的新手所以请原谅

  1. 提交未 "moved" 进入分支。
  2. git 中的每个提交都将 link 存储到父提交。
  3. 合并提交有 2 个或更多父提交(它们通常是适当分支的 HEAD)
  4. 因为这些提交实际上仍然保留其父提交合并操作 "brings all different commits(not existing in current branch before) into current branch"。实际上意味着一旦你删除合并提交(使用 git 重置或 git 还原)
  5. ,你将从当前分支中 "remove" 它们

对面:

一个。使 rebase 将通过复制它们来带来所有 "different" 提交;他们将 "behave" 就像最初为当前分支创建的本地提交一样

b。 cherry-pick 只会复制一次提交(如果您使用分支名称作为参数,则为最后一次提交);但你可以指定一个范围

你可以很容易地自己做实验(需要使用终端)

在命令行中转到您最喜欢的文件夹:

创建一个空的 repo

mkdir test-repo
cd test-repo
git init

添加一些内容(我们将创建一个文件,我们将在每次提交时更改内容)

echo 0 > file.txt
git add file.txt
git commit -m '0'

创建分支 A

git checkout -b A
echo 1 > file.txt; git add file.txt; git commit -m '1'
echo 2 > file.txt; git add file.txt; git commit -m '2'
echo 3 > file.txt; git add file.txt; git commit -m '3'
git log --graph --oneline --all

创建分支 B

git checkout master
git checkout -b B
echo 4 > file.txt; git add file.txt; git commit -m '4'
echo 5 > file.txt; git add file.txt; git commit -m '5'
git log --graph --oneline --all

所以在分支 A 中我们有一个编号为 3 的文件,在分支 B 中有一个编号为 5 的文件 让我们将 A 合并到 B(你当前的分支是 B,记住)

git merge B

您会看到一个容易解决的冲突

cat file.txt

<<<<<<< HEAD
5
=======
3
>>>>>>> A

修复并提交:

git commit
git log --graph --oneline --all

历史看起来像这样:

这里发生了什么,您只需创建一个 links A int B 的新提交,此提交具有 2 个分支之间的冲突解决方案。 而你还在B

分支

这意味着您可以删除此提交并返回预览状态,只需删除此提交即可:

git reset --hard HEAD~1
git log

所以现在让我们反过来,去分支A,让'merge B into A'。

git checkout A
git merge B

再次修复看起来很相似但不完全相同的冲突

cat file.txt


<<<<<<< HEAD
3
=======
5
>>>>>>> B

解决冲突,你应该处于相同的状态,但技术上不是:) 您在B

分行
git commit
git log --graph --oneline --all 

那么有什么区别呢?冲突的顺序,但更重要的是,您所在的最终分支的名称。

所以合并创建另一个提交 link 一个分支的不同历史到另一个分支(这就是为什么提交 0 在这个例子中不重复)。

如果你喜欢干净的历史,那么最终的历史是这样的:

你应该玩 rebase。但这看起来超出了这个问题的范围。

如果您只想从一个分支创建一个提交以添加到另一个分支,您可以 squashrebase

Git 是边做边学更容易的东西。经常检查您的 git log。了解如何使用 git reflog 获得信心(这就是 git 很棒的原因)并给 git rebase 命令一个机会。然后与您的团队讨论并确定最佳工作流程。