Bagaimana saya bisa menggabungkan dua komit menjadi satu komit?

99

Saya memiliki 'proyek pertama' cabang dengan 2 komit. Saya ingin menyingkirkan komit ini dan membuatnya muncul sebagai komit tunggal.

Perintahnya git merge --squashterdengar menjanjikan, tetapi ketika saya menjalankan git merge --squashterminal saya hanya menampilkan opsi untuk perintah tersebut. Apa perintah yang benar?

Commit 1:
Added 'homepage.html'
Added 'contacts.html'

Commit 2:
Added 'homepage.php'
Added 'homepage.php'
Deleted 'homepage.html'
Deleted 'contacts.html'
Don P.
sumber
Saya tidak berpikir itu adalah perintah yang benar. Juga, saya ragu Anda bahkan dapat mengubah komitmen seperti itu.
BSull
Nah, Anda dapat mengubah beberapa komit menjadi satu komit: git-scm.com/book/en/Git-Tools-Rewriting-History pertanyaan saya hanya tentang perintah khusus untuk itu.
Don P
@BSull Anda benar-benar dapat mengubah komit dengan cara apa pun yang Anda inginkan. Mereka benar-benar dapat diedit kapan saja. Jika Anda berbagi kode dengan orang lain, hal itu akan menulis ulang riwayat Anda dan Anda akan bekerja secara efektif dengan cabang yang berbeda dari orang lain.
meagar
Ini seharusnya tidak pernah ditipu. Faktanya, yang lain seharusnya ditutup karena terlalu luas. Pertanyaan lain yang ditandai sebagai penipuan adalah kompleks yang tidak perlu karena melibatkan pengabaian dasar sebelumnya.
Evan Carroll

Jawaban:

134

Anda ingin git rebase -imelakukan rebase interaktif .

Jika Anda saat ini menggunakan "komit 1", dan komit yang ingin Anda gabungkan, "komit 2", adalah komit sebelumnya, Anda dapat menjalankan git rebase -i HEAD~2, yang akan memunculkan editor yang mencantumkan semua komit yang akan dilalui oleh rebase. Anda akan melihat dua baris yang dimulai dengan "pick". Untuk melanjutkan dengan squash, ubah kata pertama pada baris kedua dari "pick" menjadi "squash". Kemudian simpan file Anda, dan keluar. Git akan menekan komit pertama Anda ke komit terakhir kedua.

Perhatikan bahwa proses ini menulis ulang sejarah cabang Anda. Jika Anda mendorong kode Anda ke suatu tempat, Anda harus melakukannya git push -fdan siapa pun yang membagikan kode Anda harus melewati beberapa rintangan untuk menarik perubahan Anda.

Perhatikan bahwa jika dua komit yang dipermasalahkan bukan dua komit terakhir di cabang, prosesnya akan sedikit berbeda.

meagar
sumber
2
Bagaimana melakukannya Then write your file, and quit? Saya menggunakan Terminal Android Studio, konsol git itu sendiri Atau bahkan membuka konsol git dengan perangkat lunak SourceTree. Tapi bagaimana cara menabung dan berhenti?
Dr.jacky
1
Bagaimana cara menggabungkan 2 komit yang bukan dua komit terakhir di cabang?
Weishi Zeng
1
@meagar Saya pikir itu masuk akal ... jika Anda memeriksa masalah ini (duplikat dari ini), menekan 'arah' membuat perbedaan besar dan merupakan akar dari seluruh masalah (lihat komentar pertama dengan sekitar 200 suara positif tentang ' meremas dengan cara yang salah ') - stackoverflow.com/a/2568581/43453
PandaWood
1
@PandaWood Anda salah membaca jawabannya. Cara pertama salah sederhana , tidak berbeda . Anda hanya dapat menekan ke belakang, tidak masuk akal untuk memikirkan memasukkan komit yang lebih lama ke yang lebih baru, tetapi jika Anda bisa, itu akan menjadi operasi yang sama.
meagar
1
Saya mengerti sampai "mengubah kata pertama dari baris kedua" - baris kedua dari apa?
Andrew Torr
70

Versi sederhana malas untuk pelupa seperti saya:

git rebase -i HEAD~3 atau berapa banyak komit, bukan 3.

Putar ini

pick YourCommitMessageWhatever
pick YouGetThePoint
pick IdkManItsACommitMessage

ke dalam ini

pick YourCommitMessageWhatever
s YouGetThePoint
s IdkManItsACommitMessage

dan lakukan beberapa tindakan di mana Anda menekan esclalu enteruntuk menyimpan perubahan. [1]

Ketika layar berikutnya muncul, singkirkan sampah # baris [2] dan buat pesan komit baru atau sesuatu, dan lakukan escape entertindakan yang sama . [1]

Wowee, Anda memiliki lebih sedikit komitmen. Atau Anda baru saja merusak segalanya.


[1] - atau apa pun yang berfungsi dengan konfigurasi git Anda. Ini hanya urutan yang efisien berdasarkan pengaturan saya.

[2] - Anda akan melihat beberapa hal seperti # this is your n'th commitbeberapa kali, dengan komit asli Anda tepat di bawah pesan ini. Anda ingin menghapus baris ini, dan membuat pesan komit untuk mencerminkan maksud dari n komit yang Anda gabungkan menjadi 1.

Stachu
sumber
Solusi yang sangat ringkas - terima kasih. Mungkin berguna untuk garis besar yang sdigunakan di sini singkatan dari squash. Untuk menggunakan komit, tetapi berbaur dengan komit sebelumnya
UrbanConor
Jika Anda baru saja 2melakukan dan ingin menggabungkan 2komit yang sama , Anda harus menjalankan git reset --soft HEAD~dan git commit --amend.
scrutari
22
  1. Periksa cabang Anda dan hitung jumlah semua komitmen Anda.
  2. Buka git bash dan tulis: git rebase -i HEAD~<quantity of your commits>(yaitu git rebase -i HEAD~5)
  3. Dalam txtfile yang dibuka, ubah pickkata kunci menjadi squashuntuk semua komit, kecuali komit pertama (yang ada di atas). Untuk yang teratas, ubah ke reword(yang berarti Anda akan memberikan komentar baru untuk komit ini di langkah berikutnya) dan klik SIMPAN! Jika di vim, tekan esclalu simpan dengan memasukkan wq!dan tekan enter.
  4. Berikan Komentar.
  5. Buka Git dan buat "Ambil semua" untuk melihat perubahan baru.

Selesai

pengguna5820972
sumber
Yang pertama memberi tahu saya cara menggunakan di vim. Terima kasih banyak
Ho Luong