Pertanyaan Squash X terakhir saya berkomitmen bersama menggunakan Git


Bagaimana saya bisa menekan X terakhir saya bersama menjadi satu komit menggunakan Git?


2314
2018-03-04 04:11


asal


Jawaban:


Menggunakan git rebase -i <after-this-commit> dan ganti "pilih" pada commit kedua dan selanjutnya dengan "squash" atau "fixup", seperti yang dijelaskan di manual.

Dalam contoh ini, <after-this-commit> adalah SHA1 hash atau lokasi relatif dari HEAD dari cabang saat ini dari mana komit dianalisis untuk perintah rebase. Misalnya, jika pengguna ingin melihat 5 komit dari HEAD saat ini di masa lalu, perintahnya adalah git rebase -i HEAD~5.


1267
2018-03-04 04:18



Anda dapat melakukan ini dengan mudah tanpa git rebase atau git merge --squash. Dalam contoh ini, kita akan menekan 3 commit terakhir.

Jika Anda ingin menulis pesan commit baru dari awal, ini sudah cukup:

git reset --soft HEAD~3 &&
git commit

Jika Anda ingin mulai mengedit pesan komit baru dengan penggabungan pesan komit yang ada (mirip dengan apa yang dipilih / labu / labu / ... / squash git rebase -i daftar instruksi akan memulai Anda dengan), maka Anda perlu mengekstrak pesan-pesan itu dan meneruskannya git commit:

git reset --soft HEAD~3 && 
git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"

Kedua metode tersebut menekan tiga komit terakhir menjadi satu commit baru dengan cara yang sama. Soft reset hanya mengarahkan kembali KEPALA ke komit terakhir yang Anda tidak ingin menekan. Baik indeks maupun pohon kerja tidak tersentuh oleh soft reset, meninggalkan indeks dalam keadaan yang diinginkan untuk commit baru Anda (yaitu sudah memiliki semua perubahan dari commit yang akan Anda "buang").


2587
2018-03-05 04:19



Kamu dapat memakai git merge --squash untuk ini, yang sedikit lebih elegan daripada git rebase -i. Misalkan Anda berada di master dan Anda ingin menekan 12 commit terakhir menjadi satu.

PERINGATAN: Pertama pastikan Anda melakukan pekerjaan Anda — periksa itu git status bersih (sejak git reset --hard akan membuang perubahan yang dipentaskan dan tidak berubah)

Kemudian:

# Reset the current branch to the commit just before the last 12:
git reset --hard HEAD~12

# HEAD@{1} is where the branch was just before the previous command.
# This command sets the state of the index to be as it would just
# after a merge from that commit:
git merge --squash HEAD@{1}

# Commit those squashed changes.  The commit message will be helpfully
# prepopulated with the commit messages of all the squashed commits:
git commit

Itu dokumentasi untuk git merge menggambarkan --squash pilihan secara lebih rinci.


Memperbarui: satu-satunya keuntungan nyata dari metode ini secara lebih sederhana git reset --soft HEAD~12 && git commit disarankan oleh Chris Johnsen di jawabannya adalah bahwa Anda mendapatkan pesan komit yang dipopulasi dengan setiap pesan commit yang Anda masukkan.


573
2018-03-04 06:10



Saya sarankan menghindari git reset bila memungkinkan - terutama untuk Git-novis. Kecuali Anda benar-benar perlu mengotomatiskan proses berdasarkan pada jumlah komit, ada cara yang kurang eksotis ...

  1. Taruh perintah yang akan dijepitkan pada cabang yang berfungsi (jika mereka belum melakukannya) - gunakan gitk untuk ini
  2. Lihat cabang target (mis. 'Master')
  3. git merge --squash (working branch name)
  4. git commit

Pesan commit akan diisi sebelumnya berdasarkan pada squash.


135
2018-03-14 23:24



Berdasarkan Jawaban Chris Johnsen,

Tambahkan alias "labu" global dari bash: (atau Git Bash di Windows)

git config --global alias.squash '!f(){ git reset --soft HEAD~${1} && git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"; };f'

... atau menggunakan Command Prompt Windows:

git config --global alias.squash "!f(){ git reset --soft HEAD~${1} && git commit --edit -m\"$(git log --format=%B --reverse HEAD..HEAD@{1})\"; };f"


Anda ~/.gitconfig sekarang harus mengandung alias ini:

[alias]
    squash = "!f(){ git reset --soft HEAD~${1} && git commit --edit -m\"$(git log --format=%B --reverse HEAD..HEAD@{1})\"; };f"


Pemakaian:

git squash N

... Yang secara otomatis melumatkan yang terakhir N melakukan, inklusif.

Catatan: Pesan commit yang dihasilkan adalah kombinasi dari semua commit yang terjepit, dalam urutan. Jika Anda tidak senang dengan itu, Anda selalu bisa git commit --amenduntuk memodifikasinya secara manual. (Atau, edit alias untuk mencocokkan selera Anda.)


97
2018-02-19 19:21



Jika Anda menggunakan TortoiseGit, Anda dapat menjalankan fungsinya Combine to one commit:

  1. Buka menu konteks TortoiseGit
  2. Memilih Show Log
  3. Tandai komit yang relevan dalam tampilan log
  4. Memilih Combine to one commit dari menu konteks

Combine commits

Fungsi ini secara otomatis menjalankan semua langkah git tunggal yang diperlukan. Sayangnya hanya tersedia untuk Windows.


46
2017-11-06 12:51



Terimakasih untuk posting blog yang berguna ini Saya menemukan bahwa Anda dapat menggunakan perintah ini untuk menekan 3 commit terakhir:

git rebase -i HEAD~3

Ini berguna karena berfungsi bahkan ketika Anda berada di cabang lokal tanpa informasi pelacakan / repo jarak jauh.

Perintah akan membuka editor rebase interaktif yang kemudian memungkinkan Anda untuk menyusun ulang, menekan, memutar ulang, dll. Seperti biasa.


46
2018-05-17 06:19