Bagaimana cara mereset cabang master git ke cabang upstream di repositori bercabang?

108

Saya benar-benar mengacaukan cabang master dari repo git bercabang saya.

Saya ingin menyetel ulang sepenuhnya cabang master yang didorong ke garpu saya dengan konten repo master hulu. Saya tidak tertarik untuk menyimpan perubahan atau sejarah cabang utama.

Pendekatan paling sederhana adalah menghapus repo bercabang saya dan refork dari proyek hulu. Namun, saya memiliki pekerjaan di cabang lain yang didorong yang tidak ingin saya hilangkan.

Jadi, bagaimana cara mengatur ulang cabang master yang didorong dengan master hulu?


git clone https://myrepo.git
cd myrepo
git remote add upstream https://upstream.git
git fetch upstream

Ke mana saya pergi dari sini untuk mengatur ulang cabang master lokal dan jarak jauh saya dengan master hulu?

Fosfreedom
sumber

Jawaban:

204

Anda dapat mengatur ulang cabang master lokal Anda ke versi upstream dan mendorongnya ke repositori Anda.

Mengasumsikan bahwa "upstream" adalah repositori asli dan "origin" adalah fork Anda:

# ensures current branch is master
git checkout master

# pulls all new commits made to upstream/master
git pull upstream master

# this will delete all your local changes to master
git reset --hard upstream/master

# take care, this will delete all your changes on your forked master
git push origin master --force

(Anda dapat mendefinisikan repo asli sebagai "upstream" dengan git remote add upstream /url/to/original/repo.)

Johannes Barop
sumber
1
Mungkin juga harus git reset --hard upstream/mastermengatur ulang direktori kerja. Namun jawaban Anda benar.
j6t
1
Ini sangat membantu.
Aleem S
4
Perlu menelepon git fetch upstreamdulu
Henry E
4
Seperti yang dicatat oleh @HenryE, gagal mengambil perubahan upstream terlebih dahulu dengan git fetch upstreambiasanya menghasilkan kesalahan yang tidak dapat dibaca manusia berikut ini:"fatal: ambiguous argument 'upstream/master': unknown revision or path not in the working tree."
Cecil Curry
1
Berhati-hatilah karena dorongan paksa secara otomatis menutup semua permintaan tarik terbuka yang Anda buat untuk upstream. Saya tidak menyadari hal ini, yang merupakan sedikit kejutan.
Frank Buss
5

Ini akan mengatur ulang cabang master Anda dengan master upstream dan jika cabang telah diperbarui sejak bercabang Anda, itu akan menarik perubahan itu juga.

git checkout master 
git reset upstream/master
git pull --rebase upstream master
git push origin master --force

PS: Asumsi Upstream adalah repo asli sedangkan origin adalah salinan Anda.

Bhavesh Gupta
sumber
Ini akan tampak seolah-olah Anda membuat cabang Anda dari komit yang berbeda. Alasan utama rebasing adalah untuk mempertahankan riwayat proyek linier. Meskipun demikian, Anda tidak boleh melakukan rebase komit setelah dipublikasikan ke repositori publik karena ini menggantikan komit lama dengan yang baru. Untuk detailnya silakan lihat atlassian.com/git/tutorials/rewriting-history/git-rebase
user8128167
0

Saya sudah mencoba cara seperti ini:

$REPO=<repo>
$ORIGIN=<user>/$REPO
$UPSTREAM=<upstream>/$REPO

$ git clone [email protected]:$ORIGIN.git
$ cd $REPO
$ git checkout master
$ git remote add upstream [email protected]:$UPSTREAM.git
$ git reset --hard upstream/master
$ git pull --rebase upstream master
$ git push origin master --force

output akan menampilkan peringatan:

fatal: ambiguous argument 'upstream/master': 
unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

Jadi cara yang benar diletakkan di git pulldepan git reset:

$ git clone [email protected]:$ORIGIN.git
$ cd $REPO
$ git checkout master
$ git remote add upstream [email protected]:$UPSTREAM.git
$ git pull --rebase upstream master
$ git reset --hard upstream/master
$ git push origin master --force

maka outputnya akan seperti ini:

From github.com:<upstream>/<repo>
 * branch                master     -> FETCH_HEAD
 * [new branch]          master     -> upstream/master
HEAD is now at 7a94b1790 Merge pull request #4237 from <upstream>/...
Current branch master is up to date.
Everything up-to-date.
Chetabahana
sumber