Saya memiliki yang berikut dalam teks agenda dari git rebase -i HEAD~2
:
pick 56bcce7 Closes #2774
pick e43ceba Lint.py: Replace deprecated link
# Rebase 684f917..e43ceba onto 684f917 (2 command(s))
#
...
Sekarang, ketika saya mencoba memadamkan yang pertama ( 56bcce7
) dan memilih yang kedua dengan menambahkan "s" sebelum yang pertama, saya mendapatkan kesalahan berikut:
Cannot 'squash' without a previous commit
Bisakah seseorang menjelaskan kepada saya apa artinya, dan bagaimana cara melakukannya?
Saya ingin menghentikan commit pertama ( 56bcce7
) dan "pilih dan reword" e43ceba
commit kedua ( )
Jawaban:
Rebase interaktif menampilkan komit dalam urutan terbalik dari apa yang biasa Anda gunakan saat menggunakan
git log
.git rebase -i
memutar ulang komit yang dipilih dalam urutan (top-down) yang tepat seperti yang tercantum dalam file instruksi rebase yang disimpan. Saat squashing, komit yang dipilih untuk squashing digabungkan dengan komit yang mendahuluinya dalam daftar (diedit), yaitu komit dari baris sebelumnya. Dalam kasus Anda - tidak ada komit sebelumnya untuk56bcce7
. Anda harus melakukan salah satu dari berikut inigit rebase -i HEAD~3
(jika Anda ingin squash56bcce7
dalam684f917
)Jika Anda bermaksud menggabungkan
56bcce7
dengane43ceba
, dane43ceba
tidak bergantung pada56bcce7
, maka cukup susun ulang:UPDATE : Jawaban Gus bawah ini menyarankan cara yang lebih baik untuk melakukan hal yang sama, tanpa mengatur ulang kedua komitmen tersebut:
Ini akan memadatkan / menggabungkan dua komitmen menjadi satu. Ketika rebase interaktif meminta pesan komit yang ditulis ulang
56bcce7
, berikan pesan komit yang menjelaskan penyatuan56bcce7
dane43ceba
.sumber
56bcce7
masuke43ceba
. Jadi, bagaimana cara melakukan Langkah 1 di sini?Saya memiliki masalah serupa yang saya selesaikan sebagai berikut:
Ini adalah grup komit yang ingin saya squash:
Seperti yang Anda lihat, saya menginginkan no. 4, tetapi 1, 2 dan 3 tidak memiliki komitmen sebelumnya untuk digencet . Karenanya Cannot 'squash' tanpa kesalahan commit sebelumnya .
Solusi saya adalah menggunakan
r
opsi untuk# r, reword = use commit, but edit the commit message
Jadi daftar komitmen saya terlihat seperti ini:
Setelah menyimpan, shell interaktif meminta saya untuk menulis ulang komit yang dipilih.
Setelah itu, log komit saya menghasilkan satu komit yang menghasilkan riwayat komit yang lebih bersih.
sumber
git rebase --edit-todo
dan memperbaiki merujuk jawaban ini dan kemudian melakukannyagit rebase --continue
Saya mengalami masalah ini dan alasan mengapa hal itu terjadi dalam kasus saya adalah, Anda tidak dapat menekan komitmen lama ke komit baru. Berikut adalah contoh yang mengatakan Anda memiliki 3 komit:
Sekarang jika Anda mengatakan
git rebase -i HEAD~3
dan Anda melakukan sesuatu sepertiIni akan menghasilkan kesalahan:
Solusi:
Saat melakukan squashing, Anda harus melakukan squash baru-baru ini ke yang lama, bukan sebaliknya, sehingga dalam contoh akan menjadi seperti ini:
Ini akan berfungsi dengan baik, jika Anda ingin semua pesan komit Anda, saya akan menyarankan perbaikan daripada squash .
sumber
Squash dengan logika terbalik . Anda akan dapat memilih pesan komit yang diinginkan di langkah selanjutnya.
pick
komit pertama yang tidak Anda inginkan untuk pesan komit.squash
ataufixup
komit yang ingin Anda gabungkan, hingga komit yang memiliki pesan komit yang sebenarnya Anda inginkan.:x
)Lint.py: Replace deprecated link
.:x
)Semoga lebih jelas untuk seseorang ✌🏽
sumber
Sebaiknya katakan di editor interaktif yang berisi komit, git selalu squash dari bawah ke atas dan kita harus meninggalkan entri "pilih" di atas untuk menerima squash dari bawah.
sumber
Saya baru saja mencoba pendekatan ini.
Ini akan menunjukkan 3 komit terakhir yang akan memberi saya gambaran tentang apa yang terbaru dan mana yang pergi sebelumnya. Sekarang dinyatakan rebasing,
Pilih komit terakhir yang di atasnya kita perlu menekan dua lainnya. Commit id yang dipilih sebagai base commit akan seperti ini,
Untuk dua commit id lainnya, ubah menjadi,
atau sederhananya,
sumber
Saya juga sudah menemui masalah ini barusan, itu hanya ceroboh. Anda dapat menyelesaikan masalah seperti berikut: ketika Anda mencoba menekan yang pertama (56bcce7) dan memilih yang kedua, Anda harus menambahkan "s" sebelum baris kedua tetapi bukan yang pertama. Anda juga dapat mereferensikan situs web berikutnya: http://backlogtool.com/git-guide/en/stepup/stepup7_5.html
sumber