2013-05-31 43 views
13

Tôi thường sử dụng git pull --rebase nếu tôi đang làm việc trực tiếp trên máy chủ (mà tôi vẫn cố gắng không làm). Trong trường hợp tôi quên làm một rebase và chỉ cần làm git pull, có cách nào để hoàn tác điều đó và làm cho nó tuyến tính, thay vì có một hợp nhất? Sẽ làm một rebase tại thời điểm này là một ý tưởng tồi (nếu điều đó thậm chí sẽ thực hiện bất cứ điều gì)?git rebase sau khi kéo

Tôi biết tôi có thể đặt bật theo mặc định cho các lần kéo theo mặc định vì vậy tôi không quên, nhưng đây là vấn đề cần biết phải làm gì trong trường hợp này.

+3

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

+0

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? –

Trả lời

3

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

14

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. :-)

0

Tôi muốn cung cấp cho bạn một số lời khuyên giúp giữ lịch sử tuyến tính. Đặt cấu hình git sau đây để tự động khởi động nhánh khi bạn thực hiện kéo.

$ git config branch.autosetuprebase always 

Sau khi áp dụng thiết lập này, bạn không cần phải gõ lệnh pull đầy đủ với --rebase tham số, chỉ git pull.

biết thêm thông tin bạn có thể nhận được trong bài viết này http://stevenharman.net/git-pull-with-automatic-rebase

+0

Như đã nêu trong câu hỏi của tôi, tôi biết tôi có thể làm điều này. Tôi chỉ đang cố gắng tìm hiểu phải làm gì trong trường hợp này. –

Các vấn đề liên quan