Bagaimana cara memajukan cabang dengan cepat?

249

Saya beralih ke master setelah berkembang di cabang untuk waktu yang lama. Log menunjukkan:

Cabang Anda berada di belakang 'asal / master' oleh 167 komitmen, dan dapat diteruskan dengan cepat.

Saya mencoba:

git checkout HEAD

Itu tidak berpengaruh. Ini karena saya telah checkout komit menengah pada master.

Bagaimana membuat master tetap di kepala?

pengguang001
sumber
6
git checkout HEADtidak pernah melakukan apapun. HEADsudah berarti komitmen check-out.
Emre Tapcı

Jawaban:

244

Perbuatan:

git checkout master
git pull origin

akan mengambil dan menggabungkan origin/mastercabang (Anda dapat mengatakan bahwa git pullasal adalah default).

Greg Hewgill
sumber
52
Saya pikir jawaban Rob lebih baik. Saya biasanya menghadapi situasi ini di mana saya baru saja selesai menarik dan kemudian saya beralih ke cabang yang berbeda, yang perlu diteruskan dengan cepat. Itu menjengkelkan bagi saya jika saya harus melakukan tarikan (tanpa op) lainnya dan menunggu sampai selesai; melakukan operasi lokal saja lebih cepat dan itulah yang saya inginkan.
Baron Schwartz
353

Coba git merge origin/master. Jika Anda ingin memastikan bahwa itu hanya fast-forward, Anda bisa mengatakannya git merge --ff-only origin/master.

rob mayoff
sumber
4
Ini bagus untuk digunakan ketika remote Anda memiliki beberapa rintangan otentikasi untuk melompati. Ketika saya menarik satu cabang, saya harus mengautentikasi. Kemudian, ketika saya beralih ke cabang lain (yaitu, untuk mengambil perubahan saya), saya lebih suka menggunakan mergeperintah ini sehingga saya tidak perlu mengautentikasi ulang.
RustyTheBoyRobot
30
--ff-onlysangat berguna.
Luke
4
Saya tidak tahu apakah origin/masterporsinya diperlukan atau apakah secara default masuk akal, tetapi saya merasa berguna untuk membuat alias untuk fast forward jadi saya ingin memastikan cabang upstream digunakan alih-alih hard coding ke origin/master: ff = merge --ff-only @{u}( @{u}upstream) .
Thor84no
2
itu lebih baik daripada jawaban yang disarankan jika Anda sedang offline
Jacek Pietal
1
Bisakah Anda menjelaskan mengapa tarikan sederhana tidak melakukan hal yang sama? Juga, apakah tarikan masih diperlukan jika kita melakukan ini?
Zuzu Corneliu
40

Dalam situasi Anda, git rebaselakukan juga triknya. Karena Anda tidak memiliki perubahan yang tidak dimiliki master, git hanya akan maju cepat. Jika Anda bekerja dengan alur kerja rebase, itu mungkin lebih disarankan, karena Anda tidak akan berakhir dengan gabungan komit jika Anda mengacaukan.

username@workstation:~/work$ git status
# On branch master
# Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
#   (use "git pull" to update your local branch)
#
nothing to commit, working directory clean
username@workstation:~/work$ git rebase
First, rewinding head to replay your work on top of it...
Fast-forwarded master to refs/remotes/origin/master.
# On branch master
nothing to commit, working directory clean
vektor suara
sumber
1
Dan sangat berguna bagi saya karena kita tidak seharusnya menggunakan git pull!
Stefan
Bahkan jika Anda memiliki beberapa perubahan yang tertunda, Anda dapat selalu simpanan dan rebase, saya tidak tahu apakah ini cara yang 'tepat' tetapi bekerja dengan sangat baik.
fn.
28
git checkout master
git pull

harus melakukan pekerjaan.

Anda akan mendapatkan pesan "Cabang Anda ada di belakang" setiap kali ketika Anda bekerja pada cabang yang berbeda dari tuan , seseorang melakukan perubahan untuk menguasai dan Anda git menarik.

(branch) $ //hack hack hack, while someone push the changes to origin/master
(branch) $ git pull   

sekarang referensi asal / master ditarik, tetapi master Anda tidak digabung dengannya

(branch) $ git checkout master
(master) $ 

sekarang master berada di belakang asal / master dan dapat diteruskan dengan cepat

this will pull and merge (so merge also newer commits to origin/master)
(master) $ git pull 

this will just merge what you have already pulled
(master) $ git merge origin/master

sekarang master dan asal / master Anda sinkron

Kuba
sumber
13

Jika Anda berdiri di cabang yang berbeda dan ingin checkout versi master terbaru, Anda juga dapat melakukannya

git checkout -B master origin/master

jontro
sumber
9

Bagi siapa saja yang ingin Fast Forward mereka tidak berada di cabang jarak jauh lain (termasuk dirinya sendiri) tanpa memeriksa cabang itu, Anda dapat melakukan:

git fetch origin master:other

Ini pada dasarnya mempercepat indeks otherke origin/masterjika Anda tidak di othercabang. Anda dapat memajukan cepat beberapa cabang dengan cara ini.

Jika Anda bekerja di cabang lain untuk beberapa waktu, dan ingin memperbarui cabang basi dari jarak jauh ke kepala masing-masing:

git fetch origin master:master other:other etc:etc
Sunny Patel
sumber
2

Tidak perlu kerumitan hanya berdiri di cabang Anda dan melakukan git pull itu bekerja untuk saya

Atau, sebagai percobaan kedua git pull origin master hanya jika Anda tidak beruntung dengan perintah pertama

Hasan Junaid Hashmi
sumber
0

Untuk rebase yang saat ini lokal tracker cabang bergerak perubahan lokal di atas negara terpencil terbaru:

$ git fetch && git rebase

Secara umum, untuk mempercepat dan menjatuhkan perubahan lokal ( hard reset ) *:

$ git fetch && git checkout ${the_branch_name} && git reset --hard origin/${the_branch_name}

untuk mempercepat dan menjaga perubahan lokal ( rebase ):

$ git fetch && git checkout ${the_branch_name} && git rebase origin/${the_branch_name}

* - untuk membatalkan perubahan yang disebabkan oleh hard reset yang tidak disengaja dilakukan pertama kali git reflog, yang menampilkan keadaan HEAD dalam urutan terbalik, temukan hash yang ditunjuk HEAD sebelum operasi reset (biasanya jelas) dan atur ulang cabang ke hash tersebut.

bobah
sumber
0

Dalam kasus Anda, untuk maju cepat, jalankan:

$ git merge --ff-only origin/master

Ini menggunakan --ff-onlyopsi git merge, karena pertanyaannya secara spesifik menanyakan "fast-forward".

Berikut adalah kutipan dari git-merge(1)yang menunjukkan opsi maju lebih cepat:

--ff, --no-ff, --ff-only
    Specifies how a merge is handled when the merged-in history is already a descendant of the current history.  --ff is the default unless merging an annotated
    (and possibly signed) tag that is not stored in its natural place in the refs/tags/ hierarchy, in which case --no-ff is assumed.

    With --ff, when possible resolve the merge as a fast-forward (only update the branch pointer to match the merged branch; do not create a merge commit). When
    not possible (when the merged-in history is not a descendant of the current history), create a merge commit.

    With --no-ff, create a merge commit in all cases, even when the merge could instead be resolved as a fast-forward.

    With --ff-only, resolve the merge as a fast-forward when possible. When not possible, refuse to merge and exit with a non-zero status.

Saya cukup sering memajukan sehingga diperlukan alias:

$ git config --global alias.ff 'merge --ff-only @{upstream}'

Sekarang saya bisa menjalankan ini ke fast-forward:

$ git ff
aude
sumber
-2

Pindahkan penunjuk cabang Anda ke HEAD:

git branch -f master

Cabang Anda mastersudah ada, jadi git tidak akan memungkinkan Anda untuk menimpanya, kecuali jika Anda menggunakan ... -f(argumen ini adalah singkatan --force)

Atau Anda dapat menggunakan rebase:

git rebase HEAD master

Lakukan dengan risiko Anda sendiri;)

Lakukan Async
sumber
1
Jangan coba ini. jika Anda mengikuti situasi, hal-hal buruk akan terjadi: C0 --- C1 --- C2 --- C3 --- C4 (master). C0 --- C1 --- C2 --- B1 --- B2 --- B3 (dev) Jika Kepala Anda berada di B3 (dev) dan Anda melakukan git branch -f master, Anda akan berakhir dengan C0 - - C1 --- C2 --- B1 --- B2 --- B3 (dev) (master). C3 --- C4 tidak dapat dijangkau dari cabang mana pun dan pada akhirnya akan menjadi sampah yang dikumpulkan. Jika Anda berada dalam situasi ini lihat reflog dan checkout C4 commit dengan opsi -b <branch> untuk membuat cabang baru.
A_P