Git kéo cho đến một cam kết cụ thể


97

Tôi muốn làm một git pullnhưng chỉ cho đến khi một cam kết cụ thể.

 A->B->C->D->E->F (Remote master HEAD)

vì vậy, giả sử local masterHEAD của tôi trỏ đến B, và tôi muốn kéo đến E. Tôi nên làm gì ?

Đây không phải là kéo một cam kết cụ thể, điều này đang kéo đến một cam kết cụ thể.



3
git fetchgit merge E.
chọc vào

Tôi hiện đang ở B chẳng hạn nhưng tôi chỉ muốn kéo C, E và F. Tôi muốn loại bỏ D. Cảm ơn!
Frenkey

@Frenkey bạn có thể hợp nhất cái chính sau đó loại bỏ ba lần cam kết cuối cùng và sau đó anh đào chọn hai lần cuối cùng. Ngoài ra bạn có thể thử rebase -i cho kiểm soát hơn git sáp nhập
Ninja420

điều gì sẽ xảy ra nếu tôi chỉ muốn tìm nạp các thay đổi từ C, không bao gồm các thay đổi của A và B chỉ C? Làm thế nào tôi có thể làm điều đó?
Vikas Chauhan

Câu trả lời:


114

git pullkhông là gì ngoài git fetchtheo sau bởi git merge. Vì vậy, những gì bạn có thể làm là

git fetch remote example_branch

git merge <commit_hash>


"Tham khảo điều này" được cho là gì?
developerbmw,

@Brett Quên để gửi liên kết .. loại bỏ nó hoàn toàn
unrealsoul007

@ unsalsoul007 điều này sẽ hợp nhất chỉ một cam kết cụ thể phải không? Vì vậy, để kéo từ B lên E, lệnh sẽ là git merge <commit_hash C> <commit_hash D> <commit_hash E> phải không?
Wim Feijen

6
@WimFeijen git merge Esẽ hợp nhất Ecùng với tất cả tổ tiên của nó CD(git biết điều đó ABkhông cần phải hợp nhất vì chúng đã ở trong chi nhánh của bạn). Nếu bạn CHỈ muốn thay đổi Ethì bạn nên git cherry-pick Ethay thế.
neXus

Cảm ơn mọi người vì câu trả lời, tôi đang tìm kiếm vấn đề tương tự.
Akash Bisariya

22

Đầu tiên, tìm nạp các cam kết mới nhất từ ​​kho lưu trữ từ xa. Điều này sẽ không ảnh hưởng đến chi nhánh địa phương của bạn.

git fetch origin

Sau đó, kiểm tra nhánh theo dõi từ xa và ghi nhật ký git để xem các cam kết

git checkout origin/master
git log

Lấy băm cam kết của cam kết mà bạn muốn hợp nhất (hoặc chỉ ~ 5 ký tự đầu tiên của nó) và hợp nhất cam kết đó thành chính

git checkout master
git merge <commit hash>

1
Tôi đã bỏ phiếu cho bạn vì điều này không hoạt động như quảng cáo. Trước hết, với phương thức của bạn "git fetch origin", nó sẽ tìm nạp tất cả các nhánh từ xa (điều này cần được chỉ ra một cách rõ ràng, đặc biệt là đối với những người làm việc trong các dự án có nhiều nhánh và lớn). Thứ hai, với phương pháp này, "git merge <commit hash>" không hợp nhất lịch sử cục bộ của bạn với cam kết mong muốn, nếu bạn đã quay lại lịch sử. Ví dụ: Bạn đang cục bộ ở mức cam kết 100, bạn muốn nhận được tối đa 150, bằng cách tìm nạp mọi thứ (với HEAD từ xa là 100).
Trình giữ chỗ

8
@Placeholder bạn nên đọc hướng dẫn git fetchtrước khi viết những điều vô nghĩa như vậy. Hơn nữa, bạn nên đọc câu hỏi gốc và câu trả lời của tôi. Nếu bạn làm theo câu trả lời của tôi thì bạn sẽ không bị "quay lại lịch sử" như tôi đã hướng dẫn rõ ràng cho người dùng git checkout master. Nhìn chung, vui lòng không đăng nội dung nếu bạn không rõ ràng ít nhất 50% về những gì bạn làm.
developerbmw

1
Trong trường hợp nó không rõ ràng cho bất kỳ ai khác, hãy git fetch origintìm nạp nguồn gốc một cách rõ ràng .
Daniel Farrell

2
Điều này hoạt động hoàn hảo và được giải thích tốt hơn câu trả lời được chấp nhận.
walen

1
Câu trả lời hay nhất, Hoạt động hoàn hảo
Asfandyar Khan

13

Bạn cũng có thể kéo cam kết mới nhất và chỉ hoàn tác cho đến khi cam kết mà bạn mong muốn:

git pull origin master
git reset --hard HEAD~1

Thay thế masterbằng nhánh mong muốn của bạn.

Sử dụng git log để xem bạn muốn hoàn nguyên về cam kết nào:

git log

Cá nhân tôi, điều này đã làm việc cho tôi tốt hơn.

Về cơ bản, những gì điều này làm là kéo cam kết mới nhất và bạn hoàn nguyên từng cam kết theo cách thủ công. Sử dụng git log để xem lịch sử cam kết.

Điểm tốt: Hoạt động như quảng cáo. Bạn không phải sử dụng cam kết băm hoặc kéo các nhánh không cần thiết.

Điểm xấu: Bạn cần phải hoàn nguyên từng cam kết.

CẢNH BÁO: Cam kết / lưu trữ tất cả các thay đổi cục bộ của bạn, vì --hardbạn sẽ mất chúng. Sử dụng có nguy cơ của riêng bạn!


3
Tôi không biết lý do tại sao các downvotes, điều này dường như cách sạch, và ngay sau khi bạn muốn nhận được cập nhật một cách đơn giản kéo sẽ làm, không giống như một số các câu trả lời khác
Mauricio Pasquier Juan

Đừng vì sao lại không có nhiều phiếu tán thành hơn, nhược điểm duy nhất là bạn cần phải đi HEADtrước khi quay lại - và tôi không biết điều gì sẽ xảy ra nếu bạn phải giải quyết xung đột. Nhưng giải pháp này cho phép git pull --rebasevà trái ngược với những gì đã nói, bạn có thể trực tiếp đặt lại trở lại các Ncam kết trước đó với git reset --hard HEAD~N(tức là đối với 3 cam kết, git reset --hard HEAD~3).
Stock Overflaw

2

Nếu bạn hợp nhất một cam kết vào chi nhánh của mình, bạn sẽ nhận được tất cả lịch sử giữa.

Quan sát:

$ git init ./
Kho lưu trữ Git trống được khởi tạo trong /Users/dfarrell/git/demo/.git/
$ echo 'a'> ký tự
$ git thêm chữ cái
$ git commit -m 'Thư đầu tiên'
[master (root-commit) 6e59e76] Thư đầu tiên
 1 tệp đã thay đổi, 1 lần chèn (+)
 tạo chế độ 100644 chữ cái
$ echo 'b' >> chữ cái
$ git thêm chữ cái && git cam kết -m 'Thêm chữ cái'
[master 7126e6d] Thêm chữ cái
 1 tệp đã thay đổi, 1 lần chèn (+)
$ echo 'c' >> chữ cái; git thêm thư && git cam kết -m 'Thêm thư'
[master f2458be] Thêm chữ cái
 1 tệp đã thay đổi, 1 lần chèn (+)
$ echo 'd' >> chữ cái; git thêm thư && git cam kết -m 'Thêm thư'
[master 7f77979] Đang thêm chữ cái
 1 tệp đã thay đổi, 1 lần chèn (+)
$ echo 'e' >> chữ cái; git thêm thư && git cam kết -m 'Thêm thư'
[master 790eade] Đang thêm chữ cái
 1 tệp đã thay đổi, 1 lần chèn (+)
nhật ký $ git
cam kết 790eade367b0d8ab8146596cd717c25fd895302a
Tác giả: Dan Farrell 
Ngày: Thứ Bảy 16 tháng 7 14:21:26 2015 -0500

    Thêm chữ cái

cam kết 7f77979efd17f277b4be695c559c1383d2fc2f27
Tác giả: Dan Farrell 
Ngày: Thu 16 tháng 7 14:21:24 2015 -0500

    Thêm chữ cái

cam kết f2458bea7780bf09fe643095dbae95cf97357ccc
Tác giả: Dan Farrell 
Ngày: Thu 16 tháng 7 14:21:19 2015 -0500

    Thêm chữ cái

cam kết 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
Tác giả: Dan Farrell 
Ngày: Thu 16 tháng 7 14:20:52 2015 -0500

    Thêm chữ cái

cam kết 6e59e7650314112fb80097d7d3803c964b3656f0
Tác giả: Dan Farrell 
Ngày: Thu 16 tháng 7 14:20:33 2015 -0500

    Đầu thư
$ git thanh toán 6e59e7650314112fb80097d7d3803c964b3656f
$ git thanh toán 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
Lưu ý: kiểm tra '7126e6dcb9c28ac60cb86ae40fb358350d0c5fad'.

Bạn đang ở trạng thái 'HEAD tách rời'. Bạn có thể nhìn xung quanh, thử nghiệm
thay đổi và cam kết chúng, đồng thời bạn có thể hủy bất kỳ cam kết nào bạn thực hiện trong
trạng thái mà không ảnh hưởng đến bất kỳ chi nhánh nào bằng cách thực hiện kiểm tra khác.

Nếu bạn muốn tạo một nhánh mới để giữ lại các cam kết mà bạn đã tạo, bạn có thể
làm như vậy (bây giờ hoặc sau này) bằng cách sử dụng lại -b với lệnh kiểm tra. Thí dụ:

  git checkout -b new_branch_name

HEAD hiện ở mức 7126e6d ... Đang thêm chữ cái
$ git thanh toán -b B 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
Đã chuyển sang chi nhánh mới 'B'
$ git kéo 790eade367b0d8ab8146596cd717c25fd895302a
Fat: '790eade367b0d8ab8146596cd717c25fd895302a' dường như không phải là kho lưu trữ git
nghiêm trọng: Không thể đọc từ kho lưu trữ từ xa.

Hãy đảm bảo rằng bạn có quyền truy cập chính xác
và kho lưu trữ tồn tại.
Hợp nhất $ git 7f77979efd17f277b4be695c559c1383d2fc2f27
Đang cập nhật 7126e6d..7f77979
Nhanh về phía trước
 thư | 2 ++
 1 tệp đã thay đổi, 2 lần chèn (+)
$ cat letter
a
b
c
d

1

Điều này phù hợp với tôi:

git pull origin <sha>

ví dụ

[dbn src]$ git fetch
[dbn src]$ git status
On branch current_feature
Your branch and 'origin/master' have diverged,
and have 2 and 7 different commits each, respectively.
...
[dbn src]$ git log -3 --pretty=oneline origin/master
f4d10ad2a5eda447bea53fed0b421106dbecea66 CASE-ID1: some descriptive msg
28eb00a42e682e32bdc92e5753a4a9c315f62b42 CASE-ID2: I'm so good at writing commit titles
ff39e46b18a66b21bc1eed81a0974e5c7de6a3e5 CASE-ID2: woooooo
[dbn src]$ git pull origin 28eb00a42e682e32bdc92e5753a4a9c315f62b42
[dbn src]$ git status
On branch current_feature
Your branch and 'origin/master' have diverged,
and have 2 and 1 different commits each, respectively.
...

Điều này kéo 28eb00, ff39e4 và mọi thứ trước đó, nhưng không kéo f4d10ad. Nó cho phép sử dụng cài đặt pull --rebase và kéo danh dự trong gitconfig của bạn. Điều này hoạt động vì về cơ bản bạn đang coi 28eb00 như một nhánh.

Đối với phiên bản git mà tôi đang sử dụng, phương pháp này yêu cầu hàm băm cam kết đầy đủ - không được phép viết tắt hoặc bí danh. Bạn có thể làm điều gì đó như:

[dbn src]$ git pull origin `git rev-parse origin/master^`
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.