显示当前git交互式变基操作

hgc7kmma  于 2023-06-28  发布在  Git
关注(0)|答案(2)|浏览(156)

在交互式变基过程中,例如git rebase -i HEAD~12和添加/编辑一些提交,我经常搞不清我在编辑哪个提交,尤其是当有合并冲突时:

> git status
rebase in progress; onto 55d9292
You are currently rebasing branch 'master' on '55d9292'.
  (fix conflicts and then run "git rebase --continue")
  (use "git rebase --skip" to skip this patch)
  (use "git rebase --abort" to check out the original branch)

Unmerged paths:
  (use "git reset HEAD <file>..." to unstage)
  (use "git add <file>..." to mark resolution)

        both modified:   file

no changes added to commit (use "git add" and/or "git commit -a")

我怎样才能清楚地了解当前状态中涉及的所有补丁程序?例如,什么是基本补丁,我“挑选”的补丁,合并冲突来自哪个补丁?

xjreopfe

xjreopfe1#

在交互式变基过程中,例如git rebase -i HEAD~12和添加/编辑一些提交,我经常搞不清我在编辑哪个提交
在Git 2.17(2018年第二季度)中,新的“--show-current-patch”选项提供了一种面向最终用户的方式,当“git rebase”(和“git am”)停止冲突时,可以应用差异。
参见commit fbd7a23commit 6633529commit 984913a(2018年2月11日)by Nguyễn Thái Ngọc Duy ( pclouds )
求助人:Tim Landscheidt ( scfc )
(由Junio C Hamano -- gitster --合并于commit 9ca488c,2018年3月6日)

rebase:引入并使用伪ref REBASE_HEAD

新命令git rebase --show-current-patch对于查看与当前rebase状态相关的提交非常有用。
然而,有些人可能会发现它后面的“git show”命令太有限了。
你可能想增加上下文行,做一个忽略空格的比较…
对于这些高级用例,用户可以使用新的pseudo ref REBASE_HEAD执行他们想要的任何命令。

**这也有助于显示停止的提交来自哪里,这在以前实现--show-current-patch**的补丁中很难看到。

with Git 2.26 (Q2 2020), the new git rebase/am --show-current-patchd=diff mode
Git 2.42(2023年第3季度)记录了更多的伪引用,包括REBASE_HEAD
参见commit 982ff3acommit 4fa1edbcommit b7dd54acommit 1ef3c61commit 6ec5f46commit bc11bac(2023年5月22日)by Philippe Blain ( phil-blain )
(由Junio C Hamano -- gitster --合并于commit 0899beb,2023年6月20日)

revisions.txt:记录更多特殊参考文献

签字人:菲利普·布兰
一些特殊的引用,即HEAD,FETCH_HEAD,ORIG_HEAD,MERGE_HEADCHERRY_PICK_HEAD,在'gitrevision'中提到和描述,但其他一些,即REBASE_HEAD,REVERT_HEAD,BISECT_HEAD,没有。
添加对这些特殊参考文献的简短描述。
revisions现在在其手册页中包括:
仅适用于HEADFETCH_HEADORIG_HEADMERGE_HEADREBASE_HEADREVERT_HEADCHERRY_PICK_HEADBISECT_HEAD);
revisions现在在其手册页中包括:

REBASE_HEAD

在变基期间,记录当前由于冲突或交互式变基中的edit命令而停止操作的提交。

7vhp5slm

7vhp5slm2#

如果有冲突,可以运行git show查看最后一次应用的提交。
然后,当打开冲突文件时,冲突将一方面显示文件在最后一次应用提交时的状态,另一方面显示文件在当前应用提交时的状态。
示例:
我创建了一个带有文件“a”的repo。我的第一次提交是创建文件:

John@debian-John: ~/tmp/test (master #) ✖ (1)
> touch a
John@debian-John: ~/tmp/test (master #) ✔
> git add a
John@debian-John: ~/tmp/test (master +) ✔
> git commit -m initial
[master (root-commit) 298299e] initial
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 a

然后,我修改了文件并将其提交为“commit1”:

John@debian-John: ~/tmp/test (master) ✔
> echo aaa >a
John@debian-John: ~/tmp/test (master *) ✔
> git add a
John@debian-John: ~/tmp/test (master +) ✔
> git commit -m commit1
[master 90b49f8] commit1
 1 file changed, 1 insertion(+)

然后,再做一次提交“commit2”:

John@debian-John: ~/tmp/test (master) ✔
> echo bbb >>a
John@debian-John: ~/tmp/test (master *) ✔
> git add a
John@debian-John: ~/tmp/test (master +) ✔
> git commit -m commit2
[master 14d798e] commit2
 1 file changed, 1 insertion(+)

然后我重新设置基础以删除commit1:

John@debian-John: ~/tmp/test (master) ✔
> git rebase -i HEAD^^
Auto-merging a
CONFLICT (content): Merge conflict in a
error: could not apply 14d798e... commit2

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".

Recorded preimage for 'a'
Could not apply 14d798e... commit2

无法应用Commit2,因为其上下文已更改(commit1丢失)。请注意error: could not apply 14d798e... commit2的哈希值是commit2。在冲突中,如果我运行git show,我会得到:

John@debian-John: ~/tmp/test (master *+|REBASE-i 1/1) ✖ (1)
> git show
commit 298299e3fb4e75c50aaa346c9f57c3b8885726f7 (HEAD)
Author: John Doe <john@doe>
Date:   Fri Jul 21 15:59:01 2017 +0100

    initial

diff --git a/a b/a
new file mode 100644
index 0000000..e69de29
John@debian-John: ~/tmp/test (master *+|REBASE-i 1/1) ✔
> git status
interactive rebase in progress; onto 298299e
Last command done (1 command done):
   pick 14d798e commit2
No commands remaining.
You are currently rebasing branch 'master' on '298299e'.
  (fix conflicts and then run "git rebase --continue")
  (use "git rebase --skip" to skip this patch)
  (use "git rebase --abort" to check out the original branch)

Unmerged paths:
  (use "git reset HEAD <file>..." to unstage)
  (use "git add <file>..." to mark resolution)

    both modified:   a

no changes added to commit (use "git add" and/or "git commit -a")

而a的内容是:

John@debian-John: ~/tmp/test (master +|REBASE-i 1/1) ✔
> cat a
<<<<<<< HEAD
=======
aaa
bbb
>>>>>>> 14d798e... commit2

其中HEAD是最后一次应用的提交(初始),第二部分是应用失败的提交。
我希望这会有所帮助。

相关问题