自動コミットなしのGitマージ


402

を行うことは可能git mergeですが、コミットはありませんか?

「man git merge」はこう言います:

With --no-commit perform the merge but pretend the merge failed and do not autocommit,
to give the user a chance to inspect and further tweak the merge result before
committing.

しかし、私git merge--no-commitそれを使おうとすると、まだ自動コミットします。これが私がしたことです:

$> ~/git/testrepo$ git checkout master
Switched to branch 'master'

$> ~/git/testrepo$ git branch
* master
  v1.0

$> ~/git/testrepo$ git merge --no-commit v1.0
Updating c0c9fd2..18fa02c
Fast-forward
 file1 |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

$> ~/git/testrepo$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)

その後git log、マスターにマージされたv1.0ブランチからのすべてのコミットが明らかになります。

回答:


616

マージ中に出力に注意してください-それは言っています Fast Forward

このような状況では、次のことを行います。

git merge v1.0 --no-commit --no-ff

7
矛盾がある場合はどうなりますか?
ユルゲンポール

20
@PineappleUndertheSea早送りで競合が発生することはありません。早送りなしの「実際の」マージの--no-commit場合、競合が発生しない場合にのみスイッチが有効になります。競合が発生した場合、gitは自動コミットしません。
gronostaj 2015年

38
参考:変更をマージし、マージしたすべての変更を手動で入力したかのように(従来のマージとは対照的に)コミットする場合は、rm .git/MERGE_HEAD後で実行する必要があります。これにより、gitはマージが発生したことを忘れます。
Jonn

7
Automatic merge went well; stopped before committing as requested
参考

6
どうやらgit merge BRANCHENAME --no-commit --no-ff状態を「マージ」のgitで私のワークスペースを残しました。ないかなり確実で、これはまさに、シンプルだがない何git stash savegit stash popサイクルが通常にすべてを返すように見えました。ターゲットブランチからの変更されたファイルのみが意図したとおりに配置され、MERGINGステータスではなくなりました。
MoonLite 2017

49

ここでマージの意味を誤解しています。

これ--no-commitにより、MERGE COMMITが発生しなくなります。これは、2つの分岐ブランチ履歴をマージした場合にのみ発生します。あなたの例ではそうではありません。それは、Gitが「早送り」マージであることを示し、Gitがブランチに既に存在するコミットのみを順次適用するためです。


12
それは(imo)必ずしも混乱を解消するものではありません。私は、これはドキュメントが実際にクリアされている1(比較的稀)の時間だと思う:git help merge=>「で--no-commitマージを行うが、マージをふり失敗し、ユーザーにコミットする前に、マージ結果を検査し、さらに微調整する機会を与えるために、自動コミットしません。 」当然の鍵はと一緒にそれを使用している--no-ff
マイケル・

6
...多分、厳密な用語から脱却して、このように説明する方が混乱が少ないでしょう。早送りを行う「gitマージ」は、実際にはマージがないため、マージコミットはありません。これは実際には理想的な状況です。早送りは良いことであり、この追加の「マージコミット」を行わないことが理にかなっています。これはデフォルトの動作であり、無効にしないでください。(適切に言えば、早送りは一種のマージですが、「真のマージ」ではありません。)
michael

4
これはプロジェクトのポリシーに関連しており、メインのブランチに機能を含めるようにマークする必要があるため、ffの場合でも、追加の「マージコミット」を実行/強制すると便利な場合があります。
Samus_ 2013年

7
...何。大丈夫、私はgitはほとんど救済できないと思います。特にこの答え Mercurialを試すことを私に確信させました。
ブライアンゴードン

24

入力したかのように、1回のコミットですべての変更をコミットしたい場合は、--squashも実行します

$ git merge --squash v1.0
$ git commit

1
これは同じ効果git merge v1.0 --no-commit --no-ff
ですか

2
いいえ、効果は異なります。Squashは新しいハッシュで新しいコミットを作成します。ブランチ内のすべてのコミットを1つのコミットに結合してマージします。
カビシーゲル

23

私はこの方法を好むので、まれなパラメータを覚える必要はありません。

git merge branch_name

次に、「#」コミットによってブランチが進んでいると表示されます。次のようにして、これらのコミットをポップして作業変更に入れることができます。

git reset @~#

たとえば、マージ後に1コミット先の場合は、次を使用します。

git reset @~1

注:Windowsでは、引用符が必要です。(ジョシュがコメントで述べたように)例:

git reset "@~1"

4
Windowsでは引用符が必要です:git reset "@~1"
Josh

1

ブランチにのみ1つのコミットがある場合、通常は

git merge branch_name --ff
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.