web-dev-qa-db-ja.com

ブランチの最初の(ルート)コミットでインタラクティブなリベースを使用するにはどうすればよいですか?

次のような状況の場合、

$ git log --oneline
* abcdef commit #b
* 123456 commit #a

いつでも走れることを知っている

$ git reset HEAD~ 
$ git commit --amend

しかし、走ってみました

$ git rebase -i HEAD~2

しかし私は得た

fatal: Needed a single revision
invalid upstream HEAD~2

したがって、私の質問:git rebaseを使用してこれら2つのコミットを押しつぶす方法はありますか?

24

masterブランチのルートコミットにリベースしたい。より具体的には、2つのコミットを押しつぶすには、次を実行する必要があります。

git rebase -i --root

次に、ポップアップするエディターのバッファーの2行目のsquashpickに置き換えます。

pick 123456 a                                                        
squash abcdef b

このフラグの詳細については、 git-rebaseのマニュアルページ を参照してください。

--root

<branch>でコミットするのではなく、<upstream>から到達可能なすべてのコミットをリベースします。これにより、ブランチのルートコミットをリベースできます。 [...]

ルートのインタラクティブなリベースの例

# Set things up
$ mkdir testgit
$ cd testgit
$ git init

# Make two commits
$ touch README
$ git add README
$ git commit -m "add README"
$ printf "foo\n" > README
$ git commit -am "write 'foo' in README"

# Inspect the log
$ git log --oneline --decorate --graph
* 815b6ca (HEAD -> master) write 'foo' in README
* 630ede6 add README

# Rebase (interactively) the root of the current branch: 
# - Substitute 'squash' for 'pick' on the second line; save and quit the editor.
# - Then write the commit message of the resulting commit; save and quit the editor.
$ git rebase -i --root
[detached HEAD c9003cd] add README; write 'foo' in README
 Date: Sat May 16 17:38:43 2015 +0100
 1 file changed, 1 insertion(+)
 create mode 100644 README
Successfully rebased and updated refs/heads/master.

# Inspect the log again
$ git log --oneline --decorate --graph
* c9003cd (HEAD -> master) add README; write 'foo' in README
32
jub0bs

このパラメータが役立つ可能性があります:

--root 

<upstream>で制限するのではなく、<branch>から到達可能なすべてのコミットをリベースします。これにより、ブランチのルートコミットをリベースできます。

これにより、2番目のコミットを最初のコミットにつぶすことができます(実際に修正したいと思います)。

git rebase --root -i

--rootオプションが何をするか理解するように注意してください。あなたのケースではあなたのニーズに応えますが、例えばブランチで使用される場合、それは到達可能な歴史の中で最も遠い先祖(つまり、ツリーのルート);そのため、rebase --rootは、zに基づいてaA-B-D-E-X-Y-Zを介してリベースします:

master      A-B-C
               \
upstream        D-E  
                   \     
current branch      X-Y-Z
10
guido

タイトルへの答えを探してこの質問に行きました。非常に大きなリポジトリで受け入れられた回答は、与えられたjustではなく、メインブランチ(別名:マスター)でのコミットごとにインタラクティブなリベースを生成しますブランチ。ここに来る他の人にとって、代わりの方法は親ブランチ名を使う(またはコミットする)ことです:

git rebase -i <base_branch_name>

Git docsを調べてこれを見つけた後、これに気付きました( https://git-scm.com/docs/git-rebase#_interactive_mode ):

そのまま保持する最後のコミットから開始します。

git rebase -i <after-this-commit>

エディターは、現在のブランチのすべてのコミット(マージコミットは無視)で起動されます。これらのコミットは、指定されたコミットの後に来ます。

あなたがbranch_aがマスターから分岐していて、インタラクティブにbranch_aですべてのコミットをリベースしたいとします。それを行うには、次のようにします。

git rebase -i master

または、途中で(またはコミット時に)開始する場合は、次のようにします。

git rebase -i <some-commit-hash-in-the-middle>

他の一般的な形式は、「現在の場所から5つのコミットをリベースしたい」ということを知っている場合です。

git rebase -i HEAD~5

これにより、git rebaseが数千行のコミットでエディターを開いたときに、誰かが心臓発作を回避するのに役立つことを願っています。 ─=≡Σ(((つ> <)つ

0
streetlogics