Thay đổi chi tiết sau khi kéo Git


130

Sau khi kéo Git, đầu ra của nó đưa ra một bản tóm tắt về số tiền thay đổi.

Làm cách nào tôi có thể thấy từng hoặc một số tệp thay đổi chi tiết?

Được rồi, đây là câu hỏi của tôi cho Jefromi:

  1. Làm thế nào để tôi biết nếu tôi đang kéo đến chủ? Tất cả tôi đã làm là "git kéo".

  2. Master chỉ ra điều gì và sự khác biệt giữa master và HEAD, hai cái đầu mặc định của Git là gì?

  3. Làm cách nào để xem thay đổi chi tiết trong một tệp cụ thể?

  4. Làm thế nào để tôi thấy sự thay đổi trong đầu ra tóm tắt git pullmột lần nữa?

  5. Sự khác biệt giữa git diffgit whatchanged?


4
Được rồi, việc thêm các câu hỏi mới này thông qua các chỉnh sửa không chính xác theo cách mà hệ thống dự định sẽ được sử dụng. Bạn cũng có thể rất dễ dàng trả lời rất nhiều câu hỏi của bạn bằng cách xem các trang hướng dẫn hoặc chỉ bằng cách thử mọi thứ. Ví dụ, git diffrõ ràng xuất ra một khác biệt, trong khi git whatchangedđầu ra rõ ràng một danh sách thông tin cam kết, mỗi danh sách chứa một danh sách các tệp đã thay đổi.
Cascabel

Có lẽ là do đại diện thấp của bạn.
TED

@TED ​​Chỉ mất 50 đại diện để để lại nhận xét và 15 để nâng cấp.
Cascabel

Trên máy tính xách tay của tôi với Ubuntu, đôi khi nó không hoạt động. Tôi tạm thời tìm thấy một máy tính khác có Centos và đang đưa ra nhận xét này. Trên cả hai máy tính tôi đang sử dụng Firefox.
Tim

Rất kỳ quặc. Bạn có thể muốn đi đến meta và xem nếu đó là một vấn đề đã biết / báo cáo nó.
Cascabel

Câu trả lời:


204

Giả sử bạn đang kéo đến thành thạo. Bạn có thể tham khảo các vị trí trước đây của masterbằng master@{1}(hoặc thậm chí master@{10.minutes.ago}, xem các phiên bản nêu rõ phần của trang man git-rev-phân tích cú pháp ), vì vậy mà bạn có thể làm những việc như

  • Xem tất cả các thay đổi: git diff master@{1} master

  • Xem các thay đổi đối với một tệp đã cho: git diff master@{1} master <file>

  • Xem tất cả các thay đổi trong một thư mục nhất định: git diff master@{1} master <dir>

  • Xem tóm tắt các thay đổi một lần nữa: git diff --stat master@{1} master

Đối với câu hỏi của bạn về "làm thế nào để tôi biết nếu tôi là chủ nhân" ... tốt, sử dụng các nhánh là một phần quan trọng của quy trình làm việc Git. Bạn phải luôn luôn biết bạn đang ở chi nhánh nào - nếu bạn thay đổi, bạn muốn kéo họ sang chi nhánh bên phải! Bạn có thể thấy một danh sách tất cả các chi nhánh, với dấu hoa thị của một chi nhánh hiện đang được kiểm tra, với lệnh git branch. Tên chi nhánh hiện tại cũng được in cùng với đầu ra của git status. Tôi đặc biệt khuyên bạn nên lướt qua các trang lệnh để sử dụng - đó là một cách tuyệt vời để từ từ tiếp thu một số kiến ​​thức.

Và câu hỏi cuối cùng của bạn: HEADlà tên cho chi nhánh hiện đang được kiểm tra. Bạn thực sự có thể sử dụng HEADHEAD@{1}trong bối cảnh này, nhưng sử dụng các nhánh mạnh hơn một chút, vì nếu bạn đi và kiểm tra một nhánh khác. HEADbây giờ là chi nhánh thứ hai, và HEAD@{1}bây giờ master- không phải là những gì bạn muốn!

Để tiết kiệm việc phải hỏi rất nhiều câu hỏi nhỏ như thế này, có lẽ bạn nên xem hướng dẫn về Git. Có một triệu trên web, ví dụ:


5
điều này tốt hơn giải pháp của tôi :)
Christian Oudard

2
Tôi biết điều này đã cũ, nhưng ... Nó phải là một cách khác: git diff master@{1} masternếu không, sự thay đổi được hiển thị "ngược", tức là các phần chèn thêm trở thành xóa, v.v.
ultracrepidary

2
git diff master@{1} masterkhông làm việc cho tôi thay vào đó git diff master~1 masterđã làm công việc cho tôi.
unrealsoul007

5
@ unrealsoul007 Sau đó, tình hình của bạn đã khác. master ~ 1 là cam kết chính của một master hiện đang trỏ đến; bạn sẽ thấy khác biệt cho cam kết đó. master @ {1} là master master trước đó được trỏ đến; ví dụ nếu bạn vừa kéo, đó sẽ là vị trí của chủ trước khi kéo như được mô tả ở đây. Nếu nó không làm điều đó, thì có lẽ bạn đã làm một cái gì đó khác để thành thạo kể từ khi bạn kéo. Cố gắng git reflog masterhiểu những gì.
Cascabel

@Jefromi fatal: ambiguous argument 'firstDesign@': unknown revision or path not in the working tree.Mình cứ bị lỗi này. Mặc dù git reflog FirstDesign có đầu ra này .
unrealsoul007

52

Nói rằng bạn làm một git pull như thế này:

$ git pull
remote: Counting objects: 10, done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 6 (delta 4), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.
From git@dev.example.com:reponame
   a407564..9f52bed  branchname   -> origin/branchname
Updating a407564..9f52bed
Fast forward
 .../folder/filename          |  209 ++++++++-----
 .../folder2/filename2        |  120 +++++++++++---------
 2 files changed, 210 insertions(+), 119 deletions(-)

Bạn có thể thấy sự khác biệt của những gì đã thay đổi bằng cách sử dụng các số sửa đổi:

$ git diff a407564..9f52bed

5
Và bạn có thể nhận được bản tóm tắt bằng cách sử dụng " git diff --stat a407564..9f52bed" hoặc chỉ cho một bản tóm tắt " git diff --summary a407564..9f52bed"
Jakub Narębski

14
Đối với các phiên bản mới hơn của git, git pull không còn xuất ra danh sách các tệp đã được thay đổi. Để có được điều đó, bạn cần thực hiện 'git pull --stat'
user10

6

1. Làm thế nào để tôi biết nếu tôi đang kéo đến chủ? Tất cả tôi đã làm là "git kéo".

Lệnh này hoạt động như thế này:

git pull [options] [<repository> [<refspec>…]]

và mỗi mặc định đề cập đến chi nhánh hiện tại. Bạn có thể kiểm tra các chi nhánh của bạn bằng cách sử dụng

git branch -a

Điều này sẽ liệt kê các chi nhánh địa phương và từ xa của bạn như ví dụ như vậy (Đã thêm một --- dải phân cách giữa cục bộ và từ xa để làm cho nó rõ ràng hơn)

*master
foo
bar
baz
---
origin/HEAD -> origin/master
origin/deploy
origin/foo
origin/master
origin/bar
remote2/foo
remote2/baz

Khi bạn nhìn vào một repo từ xa, bạn sẽ thấy những gì bạn đang đề cập đến:

git remote show origin

sẽ liệt kê như sau:

* remote origin
  Fetch URL: ssh://git@git.example.com:12345/username/somerepo.git
  Push  URL: ssh://git@git.example.com:12345/username/somerepo.git
  HEAD branch: master
  Remote branches:
    foo    tracked
    master tracked
  Local refs configured for 'git push':
    foo    pushes to foo    (up to date)
    master pushes to master (fast-forwardable)

Vì vậy, thật dễ dàng để chắc chắn nơi để kéo và đẩy đến.

3. làm thế nào để xem sự thay đổi chi tiết trong một tập tin cụ thể?

4. làm thế nào để xem sự thay đổi trong đầu ra tóm tắt bằng lần kéo git cuối cùng một lần nữa?

Cách dễ nhất và thanh lịch nhất (imo) là:

git diff --stat master@{1}..master --dirstat=cumulative,files

Điều này sẽ cung cấp cho bạn hai khối thông tin về những thay đổi ở giữa lần kéo cuối cùng của bạn về tình trạng công việc hiện tại. Ví dụ đầu ra (Tôi đã thêm một --- bộ chia giữa --stat--dirstatđầu ra để làm cho nó rõ ràng hơn):

 mu-plugins/media_att_count.php                     |  0
 mu-plugins/phpinfo.php                             |  0
 mu-plugins/template_debug.php                      |  0
 themes/dev/archive.php                             |  0
 themes/dev/category.php                            | 42 ++++++++++++++++++
 .../page_templates/foo_template.php                |  0
 themes/dev/style.css                               |  0
 themes/dev/tag.php                                 | 44 +++++++++++++++++++
 themes/dev/taxonomy-post_format.php                | 41 +++++++++++++++++
 themes/dev/template_parts/bar_template.php         |  0
 themes/someproject/template_wrappers/loop_foo.php  | 51 ++++++++++++++++++++++
---
 11 files changed, 178 insertions(+)
  71.3% themes/dev/
  28.6% themes/someproject/template_wrappers/
 100.0% themes/
  27.2% mu-plugins/
   9.0% themes/dev/page_templates/
   9.0% themes/dev/template_parts/
  63.6% themes/dev/
   9.0% themes/someproject/template_wrappers/
  72.7% themes/

2

Bằng cách này là loại hacky, nhưng nó sẽ cho phép bạn sử dụng các công cụ đồ họa như gitkhay gitghay git-gui:

git pull
git reset HEAD@{1}
gitg (or gitk or whatever tool you like)

Câu trả lời với hầu hết các upvote đưa ra cách tốt nhất bằng cách sử dụng công cụ git, nhưng tôi sử dụng phương pháp này vì sau đó tôi có thể sử dụng các công cụ với GUI để xem các thay đổi: P

Sau đó tôi sẽ có thêm một bước thực hiện git checkout .và sau đó thực hiện git pulllại để tôi kéo và hợp nhất đúng cách, nhưng tôi đánh giá cao khả năng kiểm tra sự khác biệt trong GUI đủ để xử lý hai bước bổ sung.

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.