Git ana dalını çatallanmış bir depodaki yukarı akış dalına nasıl sıfırlarım?


109

Çatallı git depomun ana şubesini tamamen mahvettim.

Çatalıma itilen ana dalı, yukarı akış ana deposu içeriğiyle tamamen sıfırlamak istiyorum. Herhangi bir ana dal değişikliğini veya geçmişini saklamakla ilgilenmiyorum.

En basit yaklaşım çatallanmış depomu silmek ve yukarı akış projesinden yeniden kullanmak olurdu. Ancak, kaybetmek istemediğim diğer itilmiş dallarda işlerim var.

Böylece, itilen ana dalımı yukarı akış ana birimiyle nasıl sıfırlarım?


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

Yerel ve uzak ana dallarımı yukarı akış ana birimiyle sıfırlamak için buradan nereye gidebilirim?

Yanıtlar:


205

Yerel ana şubenizi yukarı akış sürümüne sıfırlayabilir ve deponuza gönderebilirsiniz.

"Yukarı akış" ın orijinal depo ve "kaynak" ın çatalınız olduğunu varsayarsak:

# 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

(Orijinal depoyu ile "upstream" olarak tanımlayabilirsiniz git remote add upstream /url/to/original/repo.)


1
Muhtemelen git reset --hard upstream/masterçalışma dizinini de sıfırlamak olmalıdır . Ancak cevabınız yine de doğru.
j6t

1
Bu çok yardımcı oldu.
Aleem S

4
git fetch upstreamÖnce aramanız gerekiyor
Henry E

4
@HenryE belirttiği gibi, akış yönüne göre öncesinden almak için başarısız ilk değişir git fetch upstream, genellikle aşağıdaki olmayan, insanlar tarafından okunabilir hata verir:"fatal: ambiguous argument 'upstream/master': unknown revision or path not in the working tree."
Cecil Curry

1
Zorunlu itmenin, yukarı akış için yaptığınız tüm açık çekme isteklerini otomatik olarak kapatmasına dikkat edin. Bunun farkında değildim, bu biraz sürpriz oldu.
Frank Buss

5

Bu, ana dalınızı yukarı akış ana birimiyle sıfırlar ve dal, çatallandığınızdan bu yana güncellenirse, bu değişiklikleri de çeker.

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

Not: Kaynak sizin kopyanız iken Yukarı Akışın orijinal depo olduğunu varsayarsak.


Şubenizi farklı bir işlemden oluşturmuşsunuz gibi görünecektir. Yeniden satış yapmanın birincil nedeni, doğrusal bir proje geçmişini korumaktır. Bununla birlikte, taahhütleri halka açık bir depoda yayınlandıktan sonra asla yeniden sunmamalısınız çünkü bu, eski taahhütleri yenileriyle değiştirir. Ayrıntılar için lütfen atlassian.com/git/tutorials/rewriting-history/git-rebase
user8128167

0

Şu yöntemi denedim:

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

$ git clone git@github.com:$ORIGIN.git
$ cd $REPO
$ git checkout master
$ git remote add upstream git@github.com:$UPSTREAM.git
$ git reset --hard upstream/master
$ git pull --rebase upstream master
$ git push origin master --force

çıktı bir uyarı gösterecektir:

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>...]'

Öyleyse doğru yol daha git pullönce konulur git reset:

$ git clone git@github.com:$ORIGIN.git
$ cd $REPO
$ git checkout master
$ git remote add upstream git@github.com:$UPSTREAM.git
$ git pull --rebase upstream master
$ git reset --hard upstream/master
$ git push origin master --force

o zaman çıktı şöyle olacak:

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.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.