git 从 master 分支后将一些 "older" 更改带到新分支
git bring some "older" changes to a new branch after branching from master
今天git做了一个我看不懂的东西,时不时发生在我身上,我可以忍受这个疑惑。
我在昨天从 master 分支出来的一个分支上工作。在该分支上,我提交的第一个更改是重命名一些文件。然后我做了更多的提交,今天我做了一些我没有提交的更改。相反,我决定将这些更改移动到一个新分支,所以我从 master 检出而不离开我当前的分支,既没有使用这个命令提交这些文件
git checkout -b fix/new-branch --no-track master
然后,在那个分支上,我提交、推送并打开了一个 MR 以掌握。令我惊讶的是,另一个分支上的第一次提交就在那里。我不明白如何或为什么。
如果更容易理解,这是一个事件列表:
- 我在 master,所以我签到了 A
- 我做了第一次提交(重命名文件)我们称之为 commit_1_A
- 更多提交,commit_2_A 和 commit_3_A
- 进行了一些更改,但不提交
- 从 master 签出到一个新分支而不先移动到 master:
git checkout -b fix/B --no-track master
- 然后提交,commit_1_B
- 推送分支并打开一个MR
- commit_1_A 和 commit_1_B 在 MR 上,但不在 commit_2_A 或 commit_3_A
根据您的时间表,本地存储库的图表如下所示:
* cea17b6 (HEAD -> fix/B, origin/fix/B) commit_1_B
| * 9fb360f (fix/A) commit_3_A
| * e302cca commit_2_A
| * e2852f4 commit_1_A
|/
* 7dff81e (origin/master, master) Initial commit
我们看到只有 commit_1_B 应该在 fix/B -> master
的 MR 中。我看到的最直接的解释是 commit_1_A 实际上(不小心)提交给了 master,因此存在于分支 fix/B
.
由于您在创建 MR 之前没有提到 master
分支的推送,因此会导致 commit_1_A 和 commit_1_B 包含在差异中(如您所述)。您案例中的实际图表如下所示:
* 2fde583 (fix/A) commit_3_A
* b0b940a commit_2_A
| * 5821436 (HEAD -> fix/B, origin/fix/B) commit_1_B
|/
* 1a4d1f5 (master) commit_1_A
* a10f2da (origin/master) Initial commit
这些命令的结果(测试用例):
git init local-repo
git init --bare remote-repo
cd local-repo
touch file.txt
git add -A
git commit -m "Initial commit"
git remote add origin ../remote-repo
git push --set-upstream origin master
# assumed branching of fix/A
mv file.txt file2.txt
git add -A
git commit -m "commit_1_A"
git checkout -b fix/A # actual branching of fix/A
touch file3.txt
git add -A
git commit -m "commit_2_A"
echo "test" > file3.txt
git commit -am "commit_3_A"
touch some-more-changes.txt
git checkout -b fix/B --no-track master
git add -A
git commit -m "commit_1_B"
git push --set-upstream origin fix/B
git log --oneline --graph --all
今天git做了一个我看不懂的东西,时不时发生在我身上,我可以忍受这个疑惑。
我在昨天从 master 分支出来的一个分支上工作。在该分支上,我提交的第一个更改是重命名一些文件。然后我做了更多的提交,今天我做了一些我没有提交的更改。相反,我决定将这些更改移动到一个新分支,所以我从 master 检出而不离开我当前的分支,既没有使用这个命令提交这些文件
git checkout -b fix/new-branch --no-track master
然后,在那个分支上,我提交、推送并打开了一个 MR 以掌握。令我惊讶的是,另一个分支上的第一次提交就在那里。我不明白如何或为什么。 如果更容易理解,这是一个事件列表:
- 我在 master,所以我签到了 A
- 我做了第一次提交(重命名文件)我们称之为 commit_1_A
- 更多提交,commit_2_A 和 commit_3_A
- 进行了一些更改,但不提交
- 从 master 签出到一个新分支而不先移动到 master:
git checkout -b fix/B --no-track master
- 然后提交,commit_1_B
- 推送分支并打开一个MR
- commit_1_A 和 commit_1_B 在 MR 上,但不在 commit_2_A 或 commit_3_A
根据您的时间表,本地存储库的图表如下所示:
* cea17b6 (HEAD -> fix/B, origin/fix/B) commit_1_B
| * 9fb360f (fix/A) commit_3_A
| * e302cca commit_2_A
| * e2852f4 commit_1_A
|/
* 7dff81e (origin/master, master) Initial commit
我们看到只有 commit_1_B 应该在 fix/B -> master
的 MR 中。我看到的最直接的解释是 commit_1_A 实际上(不小心)提交给了 master,因此存在于分支 fix/B
.
由于您在创建 MR 之前没有提到 master
分支的推送,因此会导致 commit_1_A 和 commit_1_B 包含在差异中(如您所述)。您案例中的实际图表如下所示:
* 2fde583 (fix/A) commit_3_A
* b0b940a commit_2_A
| * 5821436 (HEAD -> fix/B, origin/fix/B) commit_1_B
|/
* 1a4d1f5 (master) commit_1_A
* a10f2da (origin/master) Initial commit
这些命令的结果(测试用例):
git init local-repo
git init --bare remote-repo
cd local-repo
touch file.txt
git add -A
git commit -m "Initial commit"
git remote add origin ../remote-repo
git push --set-upstream origin master
# assumed branching of fix/A
mv file.txt file2.txt
git add -A
git commit -m "commit_1_A"
git checkout -b fix/A # actual branching of fix/A
touch file3.txt
git add -A
git commit -m "commit_2_A"
echo "test" > file3.txt
git commit -am "commit_3_A"
touch some-more-changes.txt
git checkout -b fix/B --no-track master
git add -A
git commit -m "commit_1_B"
git push --set-upstream origin fix/B
git log --oneline --graph --all