Git bergabung tanpa komit otomatis

404

Apakah mungkin untuk melakukan git merge, tetapi tanpa komitmen?

"man git merge" mengatakan ini:

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.

Tetapi ketika saya mencoba menggunakannya git mergedengan --no-commititu masih auto-commit. Inilah yang saya lakukan:

$> ~/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)

Berikutnya git logmengungkapkan semua komit dari cabang v1.0 digabung menjadi master.

selbie
sumber

Jawaban:

618

Catat output saat melakukan penggabungan - katanya Fast Forward

Dalam situasi seperti itu, Anda ingin melakukan:

git merge v1.0 --no-commit --no-ff
manojlds
sumber
7
bagaimana jika ada konflik.
Jürgen Paul
20
@PineappleUndertheSea Maju cepat tidak pernah menyebabkan konflik. Dalam kasus penggabungan "nyata" tanpa maju cepat --no-commitsaklar hanya efektif jika tidak ada konflik terjadi, dalam kasus konflik git tidak akan pernah melakukan komit otomatis.
gronostaj
38
FYI: Jika Anda ingin menggabungkan perubahan dan kemudian melakukan seolah-olah Anda telah secara manual mengetik semua perubahan yang Anda gabungkan (sebagai lawan dari penggabungan tradisional) Anda perlu menjalankan rm .git/MERGE_HEADsesudahnya, yang akan memaksa git untuk melupakan bahwa penggabungan itu terjadi.
Jonn
7
FYI: Berikut adalah contoh output untuk penggabungan yang sukses:Automatic merge went well; stopped before committing as requested
kevinarpe
6
Rupanya git merge BRANCHENAME --no-commit --no-ffmeninggalkan ruang kerja saya dalam kondisi "MERGING" git. Tidak begitu yakin apa yang dikerjakannya dengan tepat, tetapi siklus sederhana git stash savedan git stash poptampaknya mengembalikan semuanya menjadi normal; hanya dengan file yang dimodifikasi dari cabang target di tempat sebagaimana dimaksud, dan tidak lagi status GABUNGAN.
MoonLite
49

Anda salah paham arti penggabungan di sini.

The --no-commitmencegah MERGE COMMIT terjadi, dan itu hanya terjadi ketika Anda menggabungkan dua sejarah cabang yang berbeda; dalam contoh Anda itu tidak terjadi karena Git menunjukkan bahwa itu adalah gabungan "fast-forward" dan kemudian Git hanya menerapkan komit yang sudah ada di cabang secara berurutan.

Samus_
sumber
12
Itu tidak akan (imo) membersihkan kebingungan; Saya pikir ini adalah satu (relatif jarang) waktu dokumen sebenarnya jelas: git help merge=> "Dengan --no-commitmelakukan penggabungan tetapi berpura-pura penggabungan gagal dan tidak otomatis, untuk memberi pengguna kesempatan untuk memeriksa dan lebih lanjut mengubah hasil penggabungan sebelum melakukan. " Kuncinya tentu saja menggunakannya bersamaan dengan--no-ff
michael
6
... mungkin akan kurang membingungkan untuk keluar dari terminologi yang ketat dan menggambarkannya seperti ini: "git merge" yang melakukan fast-forward tidak memiliki komit gabungan karena sebenarnya tidak ada gabungan sama sekali. Ini sebenarnya adalah situasi yang ideal: maju cepat adalah Good Thing, dan tidak memiliki "gabungan komitmen" tambahan ini Masuk Akal. Ini adalah perilaku default yang baik dan tidak boleh dinonaktifkan. (Dalam bahasa yang tepat, fast-forward adalah jenis penggabungan, tetapi itu bukan "penggabungan sejati".)
michael
4
itu relatif terhadap kebijakan proyek, dalam beberapa kasus itu berguna untuk memiliki / memaksa "menggabungkan komitmen" tambahan itu bahkan ketika itu adalah karena Anda perlu menandai masuknya fitur ke cabang utama.
Samus_
7
...apa. Baiklah, saya pikir git tidak bisa diselamatkan. Jawaban ini khususnya telah meyakinkan saya untuk mencoba Mercurial.
Brian Gordon
24

Jika Anda hanya ingin mengkomit semua perubahan dalam satu commit seolah-olah Anda mengetik sendiri, --squash juga akan melakukannya

$ git merge --squash v1.0
$ git commit
Adrian Li
sumber
1
Apakah ini efek yang sama dengangit merge v1.0 --no-commit --no-ff
jpierson
2
Tidak, efeknya berbeda. Squash membuat komit baru dengan hash baru. Ini menggabungkan semua komit di cabang menjadi satu komit untuk penggabungan.
Kavi Siegel
23

Saya lebih suka cara ini jadi saya tidak perlu mengingat parameter langka.

git merge branch_name

Kemudian akan mengatakan cabang Anda " #" di depan dengan komit, Anda sekarang dapat menghilangkan komit ini dan menempatkannya ke dalam perubahan kerja dengan yang berikut:

git reset @~#

Misalnya jika setelah penggabungan itu 1 komit di depan, gunakan:

git reset @~1

Catatan: Di Windows, kutipan diperlukan. (Seperti yang dicatat Josh dalam komentar) misalnya:

git reset "@~1"
Pelet
sumber
4
Di windows, diperlukan harga:git reset "@~1"
Josh
1

Ketika ada satu komit saja di cabang, biasanya saya lakukan

git merge branch_name --ff
Sithu
sumber