Apa perbedaan antara "squash" dan "fixup" di Git / Git Extension?


111

Saya telah menggunakan Ekstensi Git untuk sementara waktu sekarang (luar biasa!) Tetapi saya belum menemukan jawaban sederhana untuk yang berikut ini:

Terkadang, saat mengetik pesan commit, salah ketik. Teman saya menunjukkan kepada saya cara memperbaikinya dengan cara berikut (di Git Extentions):

Klik kanan pada commit> Advanced> Fixup commit

masukkan deskripsi gambar di sini

Kemudian saya cukup mencentang kotak "Ubah" dan menulis ulang pesan saya dan voila! Pesan komit saya sudah diperbaiki.

Namun pilihan lain ini "Squash commit" ... Saya selalu bertanya-tanya apa fungsinya ?!

Pertanyaanku adalah:

Akankah seseorang menjelaskan kepada saya apa perbedaan persis antara Squash commit dan Fixup commit di Git / Git Extentions ? Mereka terlihat seperti ... "mirip" dengan saya: masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Jawaban:


153

Saya tidak tahu apa yang Git Extensions lakukan dengannya secara khusus, tetapi git rebasememiliki opsi untuk secara otomatis squash atau memperbaiki komitmen dengan squash! atau perbaiki! prefiks, masing-masing:

   --autosquash, --no-autosquash
       When the commit log message begins with "squash! ..." (or "fixup!
       ..."), and there is a commit whose title begins with the same ...,
       automatically modify the todo list of rebase -i so that the commit
       marked for squashing comes right after the commit to be modified,
       and change the action of the moved commit from pick to squash (or
       fixup).

Perbedaan antara squash dan fixup adalah selama rebase, squashoperasi akan meminta Anda untuk menggabungkan pesan asli dan komit squash, sedangkan fixupoperasi akan menyimpan pesan asli dan membuang pesan dari komit perbaikan.


6
Anda dapat membaca lebih lanjut tentang rebasedan squash / fixup di dokumen Git .

Ini jawaban yang bagus. Selalu bertanya-tanya mengapa saya mendapat pesan komit kombinasi.
jedd.ahyoung

66

Sederhananya, ketika rebasing serangkaian komit, setiap komit ditandai sebagai squash, memberikan Anda kesempatan untuk menggunakan pesan sebagai bagian dari pickatau rewordpesan commit.

Ketika Anda menggunakan fixuppesan dari komit itu akan dibuang.


Pesan mana yang disimpan untuk fixupitu?
IgorGanapolsky

2
@IgorGanapolsky Pesan dari komit berikutnya di pohon git. Anda pada dasarnya "menggabungkan" komitmen Anda ke dalamnya.
Alexander Haroldo da Rocha

15

Dari dokumen git-rebase, bagian "mode interaktif" :

Jika Anda ingin melipat dua atau lebih komit menjadi satu, ganti perintah "pick" untuk komit kedua dan selanjutnya dengan "squash" atau "fixup". Jika komit memiliki penulis yang berbeda, komit terlipat akan dikaitkan ke penulis komit pertama. Pesan komit yang disarankan untuk komit terlipat adalah rangkaian pesan komit dari komit pertama dan pesan komit yang memiliki perintah "squash", tapi menghilangkan pesan komit dari komit dengan perintah "perbaikan".


13

Jika pertanyaannya adalah apa perbedaan antara squashdan fixupdi git saat melakukan git rebase --interactive , maka jawabannya adalah pesan commit .

s, squash <commit> = gunakan komit, tapi gabungkan dengan komit sebelumnya

f, fixup <commit>= seperti "squash", tapi buang pesan log komit ini


Sebagai contoh:

pick 22a4667 father commit message
squash 46d7c0d child commit message # case 1
# fixup 46d7c0d child commit message # case 2

The pesan commit setelah rebasing di kasus 1 akan menjadi:

father commit message

child commit message

sedangkan pesan komit dalam kasus 2 adalah:

father commit message
# no sub messages

1

Saya mengutak-atik ekstensi git dan tidak bisa membuatnya memadatkan banyak komitmen menjadi satu. Untuk melakukan itu, saya harus menggunakan baris perintah dan menemukan posting ini bermanfaat

git rebase -i Head~2

Ini adalah rebase interaktif, dan perhatikan hal berikut:

  • ~ 2 di sini mengacu pada berapa banyak komit yang ingin Anda libatkan dalam operasi ini, termasuk head saat ini
  • Anda harus mengedit jendela edit interaktif subkuen, biarkan item pertama sebagai "pilih" dan ganti baris berikutnya dengan "squash". Petunjuk pada tautan di atas jauh lebih jelas jika tidak tembus cahaya.

Posting yang Anda tautkan adalah tentang penjelasan paling jelas yang pernah saya lihat tentang squash dan fixup. Terima kasih!
Simon Tewsi

0

Mengapa tidak menanyakan git sendiri? Ketika Anda melakukan rebase dengan git-bash, dikatakan:

pick 512b1d7 (some comment)
# Rebase 621b2e4..512b1d7 onto 621b2e4 (1 command)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# .       create a merge commit using the original merge commit's
# .       message (or the oneline, if no original merge commit was
# .       specified). Use -c <commit> to reword the commit message.
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
D:/code/fenixito-legacy-api/.git/rebase-merge/git-rebase-todo [unix] (11:57 23/10/2019)                                         1,1 start
"D:/code/xxx/.git/rebase-merge/git-rebase-todo" [UNIX] 27L, 1170C

Jadi kamu melihat:

s, squash = gunakan komit, tapi gabungkan dengan komit sebelumnya

f, fixup = like "squash", tapi buang pesan log komit ini

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.