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

Placeholder
sumber

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.

gerimis
sumber
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.

ocodo
sumber
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".

Paulo Lieuthier
sumber
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
Loi Nguyen Huynh
sumber
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.
BraveNewMath
sumber
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

WesternGun
sumber