Git - 存储全部提交
Git - Stash Full Commits
有什么方法可以存储完整的提交(增量、注释等...)吗?
我的用例是:
- 我有一个分支 A off master 有 10 次提交
- 我在 A 之外有一个分支 B,有两个提交
- 我对 A 进行了更改(使用交互式变基)
- 我需要将 B 变基到 A 中的新更改上,但是有很多手动冲突解决方法
- 我想 "stash" B 中的前两个提交,硬重置到 master,变基到 A,然后弹出我的 "stash"
我知道我可以使用临时分支和 cherry-pick,但是有什么方法可以就地完成吗?
更新:
1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9
↑ ↑ ↑
master A B
After making changes to A:
1 -> 2 -> 3 -> 4 -> 5A -> 6A -> 7
↑ ↑
master A
Now I'd like for B to look like
1 -> 2 -> 3 -> 4 -> 5A -> 6A -> 7 -> 8 -> 9
↑ ↑ ↑
master A B
使用我的精选解决方案(是否有替代方案也不会产生任何冲突?)
git checkout B
git branch tmp_B
1 -> 2 -> 3 -> 4 -> 5A -> 6A -> 7 -> 8 -> 9
↑ ↑ ↑
master A B
tmp_B
git reset master --hard
1 -> 2
↑
master
B
git rebase A
1 -> 2 -> 3 -> 4 -> 5A -> 6A -> 7
↑ ↑
master A
B
git cherry-pick 8..9 // no merge conflicts
git branch -D tmp_B
1 -> 2 -> 3 -> 4 -> 5A -> 6A -> 7 -> 8 -> 9
↑ ↑ ↑
master A B
Is there any way to stash full commits (delta, comment, etc...)?
据我所知没有。你会创建一个临时分支。提交已经在一个分支中,因此您实际上已经拥有了所需的内容。
I need to rebase B onto the new changes in A, but there is a lot of manual conflict resolution
Cherry picking 而不是 rebase 将无济于事,因为 rebase 是 cherry picking,它只是一系列连续的 cherry picking。因为 Git 中的冲突通常是内容冲突的结果,而不是合并算法错误,所以很少有解决冲突的巧妙方法。无论哪种方式,您都必须处理冲突。
您可以从 B 中挑选两个提交而不是变基,但除非发生非常奇怪的事情,否则将导致相同的冲突。
请注意,因为看起来您的 "changes to A" 是交互式变基的结果,所以您的存储库看起来像这样:
A
↓
5A -> 6A -> 7A
/
1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9
↑ ↑
master B
如果您只是 git checkout B; git rebase A
那么 Git 可能会感到困惑。它可能会尝试将提交 5 到 9 变基到 7A 上。这可能会导致5和5A、6和6A之间的冲突。
相反,您可以使用 git rebase --onto A 7 B
仅对 8 和 9 进行变基。这将重新设置 7 和 B 之间的所有内容,但不包括 7。它实际上是将 8 和 9 挑选到 A 上。或者你可以 git cherry-pick 8 9
,但最好习惯 git rebase --onto here from to
语法因为它更普遍地适用于分支的任何分支。
有什么方法可以存储完整的提交(增量、注释等...)吗?
我的用例是:
- 我有一个分支 A off master 有 10 次提交
- 我在 A 之外有一个分支 B,有两个提交
- 我对 A 进行了更改(使用交互式变基)
- 我需要将 B 变基到 A 中的新更改上,但是有很多手动冲突解决方法
- 我想 "stash" B 中的前两个提交,硬重置到 master,变基到 A,然后弹出我的 "stash"
我知道我可以使用临时分支和 cherry-pick,但是有什么方法可以就地完成吗?
更新:
1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9
↑ ↑ ↑
master A B
After making changes to A:
1 -> 2 -> 3 -> 4 -> 5A -> 6A -> 7
↑ ↑
master A
Now I'd like for B to look like
1 -> 2 -> 3 -> 4 -> 5A -> 6A -> 7 -> 8 -> 9
↑ ↑ ↑
master A B
使用我的精选解决方案(是否有替代方案也不会产生任何冲突?)
git checkout B
git branch tmp_B
1 -> 2 -> 3 -> 4 -> 5A -> 6A -> 7 -> 8 -> 9
↑ ↑ ↑
master A B
tmp_B
git reset master --hard
1 -> 2
↑
master
B
git rebase A
1 -> 2 -> 3 -> 4 -> 5A -> 6A -> 7
↑ ↑
master A
B
git cherry-pick 8..9 // no merge conflicts
git branch -D tmp_B
1 -> 2 -> 3 -> 4 -> 5A -> 6A -> 7 -> 8 -> 9
↑ ↑ ↑
master A B
Is there any way to stash full commits (delta, comment, etc...)?
据我所知没有。你会创建一个临时分支。提交已经在一个分支中,因此您实际上已经拥有了所需的内容。
I need to rebase B onto the new changes in A, but there is a lot of manual conflict resolution
Cherry picking 而不是 rebase 将无济于事,因为 rebase 是 cherry picking,它只是一系列连续的 cherry picking。因为 Git 中的冲突通常是内容冲突的结果,而不是合并算法错误,所以很少有解决冲突的巧妙方法。无论哪种方式,您都必须处理冲突。
您可以从 B 中挑选两个提交而不是变基,但除非发生非常奇怪的事情,否则将导致相同的冲突。
请注意,因为看起来您的 "changes to A" 是交互式变基的结果,所以您的存储库看起来像这样:
A
↓
5A -> 6A -> 7A
/
1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9
↑ ↑
master B
如果您只是 git checkout B; git rebase A
那么 Git 可能会感到困惑。它可能会尝试将提交 5 到 9 变基到 7A 上。这可能会导致5和5A、6和6A之间的冲突。
相反,您可以使用 git rebase --onto A 7 B
仅对 8 和 9 进行变基。这将重新设置 7 和 B 之间的所有内容,但不包括 7。它实际上是将 8 和 9 挑选到 A 上。或者你可以 git cherry-pick 8 9
,但最好习惯 git rebase --onto here from to
语法因为它更普遍地适用于分支的任何分支。