Câu trả lời ngắn (đã được đưa ra bởi @Alex trong nhận xét): git reset --hard HEAD^
, nhưng chỉ nếu có cam kết hợp nhất (nếu không bạn chỉ sao lưu một cam kết từ tiến nhanh).
dài phiên bản với lời giải thích:
git pull
là thực sự chỉ git fetch
Tiếp theo git merge
(trừ khi bạn ghi đè lên với --rebase
, như bạn lưu ý). Vì vậy, bạn chỉ cần để xem nếu bạn có một kết hợp thực tế cam kết hay không:
$ git pull
Updating 171ce6f..523bacb
Fast-forward
mp.py | 24 ++++++++++++++++++++++++
1 files changed, 24 insertions(+), 0 deletions(-)
create mode 100644 mp.py
Trong trường hợp này không có hợp nhất cam kết, chỉ cần một nhanh về phía trước, vì vậy, không có vấn đề không có thay đổi để rebase! Nếu bạn thực hiện git log
, bạn sẽ thấy cam kết thiếu hợp nhất, đặc biệt nếu bạn thực hiện các biểu đồ dưới đây.
Hãy bắt buộc hợp nhất.
$ git reset --hard HEAD^
HEAD is now at 171ce6f ignore *.log files
[bây giờ tôi một đằng sau remotes/origin/master
]
$ echo '# pointless comment' >> selfref.py
$ git add selfref.py
$ git commit -m 'added to force merge'
[master 260e129] added to force merge
1 files changed, 1 insertions(+), 0 deletions(-)
$ git pull
Merge made by recursive.
mp.py | 24 ++++++++++++++++++++++++
1 files changed, 24 insertions(+), 0 deletions(-)
create mode 100644 mp.py
Chúng ta có thể thấy rằng điều này xảy ra, ngay cả khi văn bản trên là mất tích, với:
$ git log --graph --decorate --abbrev-commit --pretty=oneline
* c261bad (HEAD, master) Merge branch 'master' of [ssh url]
|\
| * 523bacb (origin/master, origin/HEAD) add multiprocessing example
* | 260e129 added to force merge
|/
* 171ce6f ignore *.log files
Chúng tôi muốn lấy tên chi nhánh địa phương master
để trỏ đến (trong trường hợp này) 260e129 một lần nữa. May mắn thay đó là thực sự dễ dàng để tên:
$ git rev-parse HEAD^
260e1297900b903404c32f3706b0e3139c043ce0
(Phụ huynh kia của hiện tại, hai mẹ, hợp nhất cam kết là HEAD^2
.) Vì vậy:
$ git reset --hard HEAD^
HEAD is now at 260e129 added to force merge
và bây giờ chúng ta có thể rebase vào remotes/origin/master
(I sẽ sử dụng tên thật ngắn, origin
, để đặt tên đó):
$ git rebase origin
First, rewinding head to replay your work on top of it...
Applying: added to force merge
Bây giờ đồ thị-y một dòng nhật ký chương trình:
$ git log --graph --decorate --abbrev-commit --pretty=oneline
* 4a0b2e2 (HEAD, master) added to force merge
* 523bacb (origin/master, origin/HEAD) add multiprocessing example
* 171ce6f ignore *.log files
Từ tất cả những điều này, bạn sẽ có thể tìm ra việc cần làm nếu bạn chạy git pull
và nó phàn nàn rằng hợp nhất không thành công. :-)
tôi đoán 'git reset --hard' trở lại trước khi kéo và làm lại kéo là cách. – Alex
Cảm ơn bạn. Bạn có thể vui lòng đăng câu trả lời đó thay vì nhận xét không? –