Setel ulang cabang lain ke saat ini tanpa pembayaran

110

Saya menulis beberapa skrip untuk alur kerja Git saya.

Saya perlu mengatur ulang cabang lain (yang ada) ke yang sekarang, tanpa pembayaran.

Sebelum:

 CurrentBranch: commit A
 OtherBranch: commit B

Setelah:

 CurrentBranch: commit A
 OtherBranch: commit A

Sama dengan

 $ git checkout otherbranch 
 $ git reset --soft currentbranch
 $ git checkout currentbranch

(Catatan --soft: Saya tidak ingin memengaruhi pohon kerja.)

Apakah ini mungkin?

Alexander Gladysh
sumber
Adakah yang tahu jika ini juga mungkin di Egit?
zedoo

Jawaban:

84

Alur kerja yang Anda gambarkan tidak setara: saat Anda melakukan, reset --hardAnda kehilangan semua perubahan di pohon kerja (Anda mungkin ingin membuatnya reset --soft).

Yang Anda butuhkan adalah

git update-ref refs/heads/OtherBranch refs/heads/CurrentBranch
P Shved
sumber
3
refs/heads/
Sobat
41
Cara yang jauh lebih baik untuk melakukan ini adalah git push . current:other. Ini bekerja tanpa refs/heads(/ cc @elliottcable), dan itu juga mencegah Anda memperbarui cabang yang diperiksa. Perhatikan bahwa Anda mungkin perlu meneruskan -f (atau menggunakan +current:other) jika pembaruan tidak dipercepat.
Lily Ballard
4
Anda juga dapat menggunakan -m 'some text'argumen untuk mencatat alasan pembaruan git reflog OtherBranchreferensi ditampilkan oleh perintah, seperti "disinkronkan ke CurrentBranch". Semoga bermanfaat untuk mengingat mengapa Anda melakukannya nanti.
Levi Haskell
18
Mengapa Anda menggunakan git update-ref refs/heads/OtherBranch refs/heads/CurrentBranchatau git push . CurrentBranch OtherBranchketika Anda dapat menggunakan lebih bersih (IMO) git branch -f OtherBranch CurrentBranch? (Lihat jawaban saya di git branch -f di bawah)
Colin D Bennett
1
@BenHymers Jadi halaman manual untuk "git push" adalah kebohongan. Ini menggambarkan perintah sebagai "Perbarui referensi jarak jauh ...". padahal sebenarnya itu dapat memperbarui referensi lokal dengan baik.
Kaz
228

Setel otherbranchke titik pada komit yang sama seperti currentbranchdengan berlari

git branch -f otherbranch currentbranch

Opsi -f(gaya) memberi tahu git branch ya, saya benar-benar bermaksud untuk menimpa otherbranchreferensi yang ada dengan yang baru .

Dari dokumentasi :

-f -
force

Setel ulang ke jika sudah ada. Tanpa -f git branch menolak untuk mengubah cabang yang sudah ada.

Colin D Bennett
sumber
6
Ini adalah jawaban termudah. Terima kasih!
Robert Karl
Saya mendapatkan fatal: Cannot force update the current branch.ketika mencoba melakukan ini.
Fuad Saud
4
@FuadSaud itu karena Anda sudah otherbranchcheck out. Pertanyaan SO ini secara khusus tentang mengatur ulang cabang lain ke komit yang berbeda (yaitu tidak mengatur ulang cabang yang diperiksa). Yang ingin Anda lakukan adalah mereset cabang saat ini dengan git reset targetbranchmemaksa cabang saat ini untuk diarahkan targetbranch. Tambahkan --hardjuga untuk memaksa pohon kerja ke konten itu. Atau --softbiarkan indeks dan hanya mengubah cabang itu sendiri.
Colin D Bennett
Benar, jadi, saya tahu tentang reset. Apa yang saya cari adalah cara untuk, dalam rutinitas, selalu mengarahkan master lokal ke upstream / master, terlepas dari apa yang diperiksa. Saya pikir branch -fbisa melakukan itu.
Fuad Saud
9
Imo, ini harus menjadi jawaban yang diterima. Ini sangat meningkatkan alur kerja saya!
lethal-guitar
23

Anda dapat menyinkronkan dengan perintah ini cabang Anda kapan saja

$ git push . CurrentBranch:OtherBranch -f

Juga tanpa -f itu menggantikan set perintah ini

$ git checkout OtherBranch
$ git merge CurrentBranch
$ git checkout CurrentBranch

Ini bisa berguna ketika Anda tidak perlu mengkomit semua file Anda di CurrentBranch dan Anda tidak bisa beralih ke cabang lain.

Denis Kuznetsov
sumber
Dapat menyebabkan "jarak jauh: error: denying non-fast-forward"
Basilevs
3
Saya tidak akan memasukkan -fopsi kecuali itu benar-benar tidak bisa dihindari. Ini bekerja dengan baik tanpa itu dalam kasus saya.
Melebius