Đi đến sửa đổi cụ thể


582

Tôi đã nhân bản một kho git của một dự án nào đó. Tôi có thể chuyển các tệp về trạng thái ban đầu không và khi tôi xem lại các tệp đi đến phiên bản 2, 3, 4 ... gần đây nhất? Tôi muốn có một cái nhìn tổng quan về cách dự án đang phát triển.

Câu trả lời:


874

Sử dụng git checkout <sha1>để kiểm tra một cam kết cụ thể.


2
Bạn có thể làm điều này git log -n1. Nhưng trừ khi git checkoutthất bại, đó là một sự lãng phí nỗ lực.
Marcelo Cantos

2
Nó hoạt động. Tôi đã phải sử dụng toàn bộ sha1 (không phải một phần). Và nếu tôi muốn đưa dự án lên phiên bản thứ hai? git logbây giờ chỉ hiển thị cam kết đầu tiên, tôi có thể tìm ra sha1 của lần xác nhận tiếp theo không?
xralf

6
Bạn chỉ nên sử dụng đủ sha1 để đảm bảo tính duy nhất. Có lẽ bạn đã có một sự trùng hợp không may mắn. Git không có khái niệm về cam kết "tiếp theo"; lịch sử là một DAG với tất cả các mũi tên chỉ về phía sau. Bạn nên chạy git log --onelinevà dán đầu ra vào một tệp văn bản để tham khảo (các khoản tiền sha1 viết tắt mà nó cung cấp được đảm bảo là duy nhất). Một tùy chọn khác, nếu lịch sử của bạn là tuyến tính, là tìm hiểu có bao nhiêu cam kết từ lần cam kết đầu tiên cho đến khi mastersử dụng git checkout master~543(nếu có 543 lần xác nhận), thì git checkout master~542, v.v.
Marcelo Cantos

20
và làm thế nào để kiểm tra lại cam kết hiện tại từ "git checkout <sha1>"?
ア レ ッ

6
@AlexanderSupertramp Thanh toán chi nhánh.
Marcelo Cantos

50

Để đi đến một phiên bản cụ thể / cam kết chạy các lệnh sau. HASH-CODE bạn có thể nhận được từgit log --oneline -n 10

git reset --hard HASH-CODE

Lưu ý - Sau khi đặt lại về phiên bản / cam kết cụ thể git pull --rebase, bạn có thể chạy , nếu bạn muốn mang lại tất cả các cam kết bị loại bỏ.


1
Lưu ý rằng resetkhông chỉ kiểm tra một điểm cụ thể trong biểu đồ, nó cũng sẽ di chuyển chi nhánh hiện đang được kiểm tra của bạn
Liam

Ngoài ra reset, tất cả các thay đổi đang chờ xử lý của bạn sẽ bị loại bỏ.
WilliamKF

2
Cờ --hard sẽ xóa bất kỳ cam kết nào sau khi băm đã nói .... có thể muốn thêm bit tid nhỏ đó vào đây. Tôi chắc rằng mọi người đã mất lịch sử và tự hỏi tại sao.
Urasquirrel

git pull --rebasechỉ hoạt động nếu bạn có một điều khiển từ xa cho repo của bạn nó được cập nhật.
Keith Thompson

19

Bạn có thể có được một cái nhìn đồ họa về lịch sử dự án với các công cụ như gitk. Chỉ cần chạy:

gitk --all

Nếu bạn muốn kiểm tra một chi nhánh cụ thể:

git checkout <branch name>

Đối với một cam kết cụ thể, sử dụng hàm băm SHA1 thay vì tên chi nhánh. (Xem Treeishes trong Sách cộng đồng Git , đây là một cuốn sách hay, để xem các tùy chọn khác để điều hướng cây của bạn.)

git log có cả bộ tùy chọn để hiển thị lịch sử chi tiết hoặc tóm tắt.

Tôi không biết một cách dễ dàng để tiến lên trong lịch sử cam kết. Các dự án với một lịch sử tuyến tính có lẽ không phải là tất cả phổ biến. Ý tưởng về "sửa đổi" như bạn có với SVN hoặc CVS ​​không ánh xạ tất cả những điều đó trong Git.


2
Lưu ý: git sẽ không nói dối bạn bằng cách cung cấp cho bạn một lịch sử tuyến tính duy nhất của dự án. Đó là trừ khi dự án thực sự phát triển theo cách đó.
Andres Jaan Tack

Tiến về phía trước là vô nghĩa về mặt logic (ngay cả trong lịch sử tuyến tính), vì một cam kết không liên quan đến "tương lai". Tốt nhất, bạn có thể xác định tất cả các cam kết có cam kết trong câu hỏi là cha mẹ. Tâm trí bạn, di chuyển lạc hậu cũng không phải là một bài tập tầm thường, do sự hợp nhất.
Marcelo Cantos

5

Sử dụng khóa SHA1 của một cam kết, bạn có thể làm như sau:

  • Đầu tiên, tìm cam kết bạn muốn cho một tệp cụ thể:

    git log -n <# commits> <file-name>

    Điều này, dựa trên của bạn <# commits>, sẽ tạo ra một danh sách các cam kết cho một tệp cụ thể.

    MIPO: nếu bạn không chắc chắn những gì bạn đang tìm kiếm, một cách tốt để tìm hiểu là sử dụng lệnh sau : git diff <commit-SHA1>..HEAD <file-name>. Lệnh này sẽ hiển thị sự khác biệt giữa phiên bản hiện tại của một cam kết và một phiên bản trước đó của một cam kết cho một tệp cụ thể.

    LƯU Ý: khóa SHA1 của một cam kết được định dạng trong git log -ndanh sách là:

cam kết <SHA1 id>

  • Thứ hai, kiểm tra phiên bản mong muốn:

    Nếu bạn đã tìm thấy cam kết / phiên bản mong muốn mà bạn muốn, chỉ cần sử dụng lệnh: git checkout <desired-SHA1> <file-name>

    Điều này sẽ đặt phiên bản của tệp bạn đã chỉ định trong khu vực tổ chức. Để đưa nó ra khỏi khu vực tổ chức, chỉ cần sử dụng lệnh:reset HEAD <file-name>

Để trở lại nơi lưu trữ từ xa được trỏ đến, chỉ cần sử dụng lệnh: git checkout HEAD <file-name>


2

Tôi đã ở trong một tình huống mà chúng tôi có một nhánh chính, và sau đó một nhánh khác gọi là 17.0 và bên trong 17.0 này có một hàm băm cam kết không nói "XYZ" . Và khách hàng được cung cấp bản dựng cho đến khi sửa đổi XYZ. Bây giờ chúng tôi đã gặp một lỗi và cần phải giải quyết cho khách hàng đó. Vì vậy, chúng ta cần tạo chi nhánh riêng cho khách hàng đó cho đến khi băm "xyz" đó. Vì vậy, đây là cách tôi đã làm nó.

Đầu tiên tôi tạo một thư mục có tên khách hàng đó trên máy cục bộ của mình. Giả sử tên khách hàng là "AAA" khi thư mục đó được tạo ra theo lệnh bên trong thư mục này:

  1. git init
  2. git clone Sau lệnh này, bạn sẽ ở nhánh chính. Vì vậy, chuyển sang chi nhánh mong muốn
  3. git checkout 17.0 Điều này sẽ đưa bạn đến chi nhánh nơi có cam kết của bạn
  4. kiểm tra git Điều này sẽ đưa kho lưu trữ của bạn cho đến khi cam kết băm đó. Xem tên của chi nhánh của bạn, nó đã được thay đổi thành cam kết băm không. Bây giờ đặt tên chi nhánh cho hàm băm này
  5. nhánh git ABC Điều này sẽ tạo một nhánh mới trên máy cục bộ của bạn.
  6. kiểm tra git ABC
  7. git push origin ABC Điều này sẽ đẩy nhánh này đến kho lưu trữ từ xa và tạo một nhánh trên máy chủ git. Bạn xong việc rồi.

1

Một cách sẽ là tạo ra tất cả các cam kết từng được thực hiện cho các bản vá. kiểm tra các cam kết ban đầu và sau đó áp dụng các bản vá theo thứ tự sau khi đọc.

sử dụng git format-patch <initial revision>và sau đó git checkout <initial revision>. bạn sẽ nhận được một đống tệp trong giám đốc của mình bắt đầu bằng bốn chữ số là các bản vá.

Khi bạn đọc xong bản sửa đổi của bạn, hãy làm những gì git apply <filename>sẽ giống git apply 0001-*và đếm.

Nhưng tôi thực sự tự hỏi tại sao bạn chỉ muốn đọc các bản vá thay thế? Xin vui lòng gửi điều này trong ý kiến ​​của bạn bởi vì tôi tò mò.

hướng dẫn git cũng cho tôi điều này:

git show next~10:Documentation/README

Hiển thị nội dung của tệp Tài liệu / README như chúng hiện tại trong lần cam kết cuối cùng thứ 10 của chi nhánh tiếp theo.

bạn cũng có thể có một cái nhìn trong git blame filenameđó cung cấp cho bạn một danh sách trong đó mỗi dòng được liên kết với một tác giả hash + tác giả.


1

Để có được một mã cam kết cụ thể, bạn cần mã băm của cam kết đó. Bạn có thể lấy mã băm đó theo hai cách:

  1. Lấy nó từ tài khoản github / gitlab / bitbucket của bạn. (Đó là trên url cam kết của bạn, tức là: github.com/user/my_project/commit/ commit_hash_code ) hoặc bạn có thể
  2. git logvà kiểm tra các cam kết gần đây của bạn trên chi nhánh đó. Nó sẽ hiển thị cho bạn mã băm của cam kết của bạn và thông báo bạn đã gửi trong khi bạn đang thực hiện mã của mình. Chỉ cần sao chép và sau đó làmgit checkout commit_hash_code

Sau khi chuyển sang mã đó, nếu bạn muốn làm việc với nó và thực hiện các thay đổi, bạn nên tạo một nhánh khác với git checkout -b <new-branch-name>, nếu không, các thay đổi sẽ không được giữ lại.


0

Để kiểm tra một cam kết (nb bạn đang nhìn về quá khứ!).

  • kiểm tra git "commmitHash"

Để khởi động lại một cách tàn nhẫn từ một cam kết và xóa những nhánh sau này mà bạn có thể đã nhầm lẫn.

  • thiết lập lại git - cho "commmitHash"
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.