Làm cách nào để đặt lại nhánh git master thành nhánh ngược dòng trong kho lưu trữ được phân nhánh?


99

Tôi đã hoàn toàn làm lộn xộn nhánh chính của repo git đã chia nhánh của mình.

Tôi muốn đặt lại hoàn toàn nhánh chính đã được đẩy đến ngã ba của tôi với nội dung của repo chính ngược dòng. Tôi không quan tâm đến việc giữ lại bất kỳ thay đổi hoặc lịch sử của nhánh chính.

Cách tiếp cận đơn giản nhất là xóa repo đã chia của tôi và làm lại từ dự án ngược dòng. Tuy nhiên, tôi có việc ở các chi nhánh khác mà tôi không muốn mất.

Vì vậy, làm thế nào để tôi thiết lập lại nhánh chính được đẩy của mình với nhánh chủ ngược dòng?


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

Tôi phải đi đâu từ đây để đặt lại các nhánh chính cục bộ và từ xa của mình với nhánh cái ngược dòng?

Câu trả lời:


186

Bạn có thể đặt lại nhánh chính cục bộ của mình về phiên bản ngược dòng và đẩy nó vào kho lưu trữ của bạn.

Giả sử rằng "ngược dòng" là kho lưu trữ ban đầu và "nguồn gốc" là ngã ba của bạn:

# 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

(Bạn có thể xác định repo gốc là "ngược dòng" với git remote add upstream /url/to/original/repo.)


1
Nó có lẽ cũng nên được git reset --hard upstream/masterđặt lại thư mục làm việc. Nhưng câu trả lời của bạn vẫn đúng.
j6t 19/02/17

Không sử dụng "--hard" cũng hoạt động trong khi giữ các thay đổi cục bộ. Tôi sẽ thực hiện khôi phục cài đặt gốc trong một bước cụ thể để có thể kiểm tra sự khác biệt.
Johannes Barop

1
Điều này rất hữu ích.
Aleem S

4
Cần gọi git fetch upstreamtrước
Henry E

3
Như ghi chú @HenryE, thất bại trong việc lấy thượng nguồn thay đổi đầu tiên với git fetch upstreamthường mang lại các lỗi không phải con người có thể đọc được như sau:"fatal: ambiguous argument 'upstream/master': unknown revision or path not in the working tree."
Cecil Curry

5

Điều này sẽ đặt lại nhánh chính của bạn với nhánh chính ngược dòng và nếu nhánh đã được cập nhật kể từ khi bạn chia nhánh, nó cũng sẽ kéo theo những thay đổi đó.

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

Tái bút: Giả sử Upstream là repo gốc trong khi origin là bản sao của bạn.


Nó sẽ xuất hiện như thể bạn đã tạo chi nhánh của mình từ một cam kết khác. Lý do chính cho việc phục hồi là để duy trì lịch sử dự án tuyến tính. Điều đó nói rằng, bạn không bao giờ nên rebase các cam kết khi chúng đã được xuất bản lên một kho lưu trữ công khai vì điều này thay thế các cam kết cũ bằng các cam kết mới. Để biết chi tiết, vui lòng xem atlassian.com/git/tutorials/rewriting-history/git-rebase
user8128167 Ngày

0

Tôi đã thử phương pháp như thế này:

$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

đầu ra sẽ hiển thị cảnh báo:

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

Vì vậy, cách chính xác được đặt git pulltrước 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

thì đầu ra sẽ như thế này:

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.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.