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.

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

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.


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

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"

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.