Git: Buang semua perubahan pada cabang lokal yang berbeda

117

Saya memiliki cabang topik lokal yang melacak cabang jarak jauh. Demi argumen, katakanlah sejarah komit terlihat seperti ini:

A--B--C--O1--O2--O3 (origin/phobos)
       \
         L1--L2--L3 (phobos)

Setelah melihat sejarah komit relatif, saya sekarang ingin membuang semua perubahan ke phoboscabang lokal dan mengembalikannya menjadi salinan langsung origin/phobos, sehingga riwayat lokal terlihat seperti ini:

A--B--C--O1--O2--O3 (phobos origin/phobos)

Saya benar-benar tidak ingin perubahan lokal ke phoboscabang, dan saya benar-benar tidak ingin penggabungan muncul di repositori asal setelahnya. (Jadi, penggabungan saja bukanlah yang ada dalam pikiran saya.)

Sepertinya ini seharusnya sangat mudah, tetapi google-fu saya telah mengecewakan saya. Bagaimana saya melakukan ini?

Electrons_Ahoy
sumber

Jawaban:

79

Hapus cabang, lalu buat kembali:

$ git branch -D phobos
$ git checkout --track -b phobos origin/phobos
mipadi
sumber
37
Masalah dengan pendekatan ini versus menyetel ulang kepala cabang, adalah menghapus cabang akan menghilangkan reflog cabang. Di sisi lain, menyetel ulang cabang tidak hanya mempertahankan reflog, tetapi sebenarnya merekam penyetelan ulang di reflog tersebut. Ini membuat operasi nanti mudah dibalik, jika diperlukan.
Dan Moulding
9
@Electrons_Ahoy Sarankan Anda mengubah jawaban yang diterima di sini menjadi Dan (sehingga orang-orang seperti saya yang telah mencari di Google cara melakukannya cenderung memilih metode yang lebih aman).
Steve Chambers
4
Jawaban @ DanMoulding tidak melibatkan penghapusan cabang lokal jika tidak diperlukan. Itu jauh lebih aman.
brma
@brma: Bagaimana bisa? Ini masih hanya mengarahkan cabang ke komit baru.
mipadi
5
Jawaban Dan Moulding lebih aman. Saya pikir Anda harus memilih yang itu.
Daniel Apt
331
git checkout phobos
git reset --hard origin/phobos

Ini memberitahu Git untuk mengatur ulang kepala dari phoboske komit yang sama seperti origin/phobos, dan untuk memperbarui pohon kerja agar cocok.

Dan Molding
sumber
35
IMO ini harus menjadi jawaban yang diterima; itu mengeluarkan perintah "reset" untuk mentransplantasikan pointer cabang, daripada melakukan operasi dengan menghapus / membuat ulang.
vdboor
Sebenarnya, saya mencoba yang ini terlebih dahulu dan itu membuat banyak kesalahan yang dibuat oleh salinan lokal hampir tidak dapat digunakan. Hapus / buat ulang mungkin kurang elegan, tetapi saya tidak perlu mengajukan pertanyaan lanjutan.
Electrons_Ahoy
3
@Electrons_Ahoy: Hmm, itu pasti tidak normal. Melakukan reset ini biasanya harus menjadi operasi bebas masalah jika repo Anda berfungsi dengan baik.
Dan Moulding
atau bahkan jika itu hinky. Gunakan git reflog untuk menemukan jalan pulang jika Anda "tidak sengaja" mengeluarkan perintah ini tanpa benar-benar membaca fungsinya. :)
dbn
Ini juga berfungsi jika Anda berada di cabang dan Anda mengacaukannya secara lokal.
slott