Làm thế nào để xem trước git-pull mà không cần tìm nạp?


204

Nó thậm chí có thể?

Về cơ bản, có một kho lưu trữ từ xa mà tôi sử dụng chỉ:

git pull

Bây giờ, tôi muốn xem trước những gì lực kéo này sẽ thay đổi (một khác biệt) mà không chạm vào bất cứ thứ gì về phía tôi. Lý do là thứ tôi đang kéo có thể không "tốt" và tôi muốn người khác sửa nó trước khi làm cho kho lưu trữ của tôi "bẩn".


4
Chỉnh sửa của bạn là lạ. Thực hiện "git fetch" không làm thay đổi cây làm việc của bạn theo bất kỳ cách nào, vì vậy sẽ không có vấn đề gì nếu bạn có những thay đổi cục bộ không được cam kết. Và nó không rõ ràng một phần của tìm nạp mà bạn muốn hoàn tác, vì nó không chạm vào cây công việc của bạn.
dkagedal

Cảm ơn dkagedal, tôi đã viết điều này trước khi tôi hoàn toàn hiểu cách Git hoạt động. Tôi gỡ bỏ chỉnh sửa đó.
Milan Babuškov

Câu trả lời:


233

Sau khi thực hiện git fetch, hãy thực hiện git log HEAD..origin/masterđể hiển thị các mục nhật ký giữa cam kết chung cuối cùng của bạn và nhánh chính của nguồn gốc. Để hiển thị các khác biệt, sử dụng hoặc git log -p HEAD..origin/masterđể hiển thị từng bản vá hoặc git diff HEAD...origin/master(ba dấu chấm không phải hai) để hiển thị một khác biệt.

Thông thường không cần phải hoàn tác tìm nạp, vì thực hiện tìm nạp chỉ cập nhật các nhánh từ xa và không có chi nhánh nào của bạn . Nếu bạn chưa sẵn sàng thực hiện thao tác kéo và hợp nhất trong tất cả các cam kết từ xa, bạn có thể sử dụng git cherry-pickđể chỉ chấp nhận các cam kết từ xa cụ thể mà bạn muốn. Sau này, khi bạn sẵn sàng nhận mọi thứ, git pullsẽ hợp nhất trong phần còn lại của các cam kết.

Cập nhật: Tôi không hoàn toàn chắc chắn lý do tại sao bạn muốn tránh sử dụng git fetch. Tất cả git fetch hiện là cập nhật bản sao cục bộ của các nhánh từ xa. Bản sao cục bộ này không liên quan gì đến bất kỳ chi nhánh nào của bạn và nó không liên quan gì đến những thay đổi cục bộ không được cam kết. Tôi đã nghe nói về những người chạy git fetch trong một công việc định kỳ vì nó rất an toàn. (Tuy nhiên, tôi thường không khuyên bạn nên làm điều đó.)


Tôi đoán rằng tôi đã bỏ lỡ phần 'không liên quan gì đến các chi nhánh CỦA TÔI' khi đọc tài liệu. Cảm ơn.
Milan Babuškov

1
Vì một số lý do mà nó không làm việc cho tôi. Tôi đã thử git diff HEAD ... origin / master và nó không liệt kê bất kỳ thay đổi nào khi tôi thực hiện 'pull master master', nó tìm nạp và hợp nhất các thay đổi. Có phải vì tôi đã thiết lập kho lưu trữ từ xa bằng git remote add?
screenm0nkey

@ screenm0nkey: Tôi không biết (mà không biết thêm thông tin). Tôi khuyên bạn nên mở một câu hỏi mới để hỏi về điều này nếu bạn vẫn không chắc chắn.
Greg Hewgill

1
Điều gì làm việc cho tôi (sau khi git fetch): git log origin / master
slaman

2
git diff ...@{u}cũng giống như git diff HEAD...origin/masternếu nguồn gốc / chủ là nhánh ngược dòng
chiếu vào

47

Tôi nghĩ git fetch là những gì bạn đang tìm kiếm.

Nó sẽ kéo các thay đổi và đối tượng mà không cam kết chúng với chỉ mục của đại diện địa phương của bạn.

Chúng có thể được hợp nhất sau đó với git merge .

Trang nam

Chỉnh sửa: Giải thích thêm

Trực tiếp từ liên kết Khóa học Git- SVN

Bây giờ, làm thế nào để bạn nhận được bất kỳ thay đổi mới từ một kho lưu trữ từ xa? Bạn lấy chúng:

git fetch http://host.xz/path/to/repo.git/ 

Tại thời điểm này, chúng nằm trong kho lưu trữ của bạn và bạn có thể kiểm tra chúng bằng cách sử dụng:

git log origin 

Bạn cũng có thể khác biệt những thay đổi. Bạn cũng có thể sử dụng git log HEAD..origin để xem chỉ những thay đổi bạn không có trong chi nhánh của mình. Sau đó, nếu muốn hợp nhất chúng - chỉ cần làm:

git merge origin

Lưu ý rằng nếu bạn không chỉ định một nhánh để tìm nạp, nó sẽ thuận tiện mặc định theo điều khiển từ xa.

Đọc trang người đàn ông là trung thực sẽ cung cấp cho bạn sự hiểu biết tốt nhất về các tùy chọn và cách sử dụng nó.

Tôi chỉ đang cố gắng thực hiện điều này bằng các ví dụ và bộ nhớ, hiện tại tôi không có hộp để kiểm tra. Bạn nên nhìn vào:

git log -p //log with diff

Việc tìm nạp có thể được hoàn tác với thiết lập lại git --hard ( liên kết ), tuy nhiên tất cả các thay đổi không được cam kết trong cây của bạn sẽ bị mất cũng như các thay đổi bạn đã tìm nạp.


Nếu bạn giải thích hai điều, điều đó có thể tốt: 1. làm thế nào để tôi hoàn tác git-fetch? 2. Làm thế nào để tôi thấy khác biệt?
Milan Babuškov

1
1) hoàn tác git-fetch? 2) git diff ĐẦU..origin
Chris Vest

Sự khác biệt được thực hiện như Christian đã nói, việc tìm nạp có thể được hoàn tác với thiết lập lại git - tuy nhiên, tất cả các thay đổi không được cam kết trong cây của bạn sẽ bị mất cũng như những thay đổi bạn đã tìm nạp.
Brian Gianforcaro

Bạn đang tìm kiếm git reset --softhay --mixed? Kiểm tra trang.
Aristotle Pagaltzis

1
Nếu tôi hiểu đúng thì không cần phải hoàn tác "git fetch" vì nó không chạm vào bản sao làm việc của bạn và cũng không phải là kho lưu trữ của bạn. "git fetch" lưu trữ các đối tượng và refs trong .git / FETCH_HEAD
Thorsten Niehues

21

Bạn có thể tìm nạp từ một repo từ xa, xem sự khác biệt và sau đó kéo hoặc hợp nhất.

Đây là một ví dụ cho một repo từ xa được gọi originvà một nhánh được gọi là mastertheo dõi nhánh từ xa origin/master:

git checkout master                                                  
git fetch                                        
git diff origin/master
git pull --rebase origin master

8

Tôi đã tạo một bí danh git tùy chỉnh để làm điều đó cho tôi:

alias.changes=!git log --name-status HEAD..

với điều đó bạn có thể làm điều này:

$git fetch
$git changes origin

Điều này sẽ giúp bạn có một cách dễ dàng và dễ dàng để xem trước các thay đổi trước khi thực hiện merge.


bạn là THIÊN CHÚA. điều này sẽ đến trong chính git
Z. Khullah

3

Tôi sử dụng hai lệnh này và tôi có thể thấy các tập tin để thay đổi.

  1. Lần đầu tiên thực hiện git fetch , nó cho đầu ra như thế này (một phần của đầu ra):

    ...
    72f8433..c8af041 phát triển -> nguồn gốc / phát triển
    ...

Hoạt động này cung cấp cho chúng tôi hai ID cam kết, đầu tiên là ID cũ và thứ hai sẽ là ID mới.

  1. Sau đó so sánh hai cam kết này bằng git diff

    git diff 72f8433..c8af041 | grep "khác biệt"

Lệnh này sẽ liệt kê các tệp sẽ được cập nhật:

diff --git a/app/controller/xxxx.php b/app/controller/xxxx.php
diff --git a/app/view/yyyy.php b/app/view/yyyy.php

Ví dụ: app / controller / xxxx.phpapp / view / yyyy.php sẽ được cập nhật.

So sánh hai cam kết sử dụng git diff in tất cả các tệp được cập nhật với các dòng đã thay đổi, nhưng với grep, nó tìm kiếm và chỉ nhận các dòng chứa diff --git từ đầu ra.


3

Tôi có thể đến bữa tiệc muộn, nhưng đây là điều khiến tôi chán nản quá lâu. Theo kinh nghiệm của tôi, tôi muốn xem những thay đổi nào đang chờ xử lý hơn là cập nhật bản sao làm việc của tôi và xử lý những thay đổi đó.

Điều này đi trong ~/.gitconfigtập tin:

[alias]
        diffpull=!git fetch && git diff HEAD..@{u}

Nó tìm nạp nhánh hiện tại, sau đó thực hiện một khác biệt giữa bản sao làm việc và nhánh được tìm nạp này. Vì vậy, bạn chỉ nên xem những thay đổi sẽ đi kèm git pull.


1
Bạn có thể trao đổi chuỗi ref cho HEAD..@{u}? Nó đơn giản hơn và không yêu cầu điều khiển từ xa được đặt tên là "nguồn gốc" hoặc chi nhánh của bạn được đặt tên giống như trên điều khiển từ xa.
Michael - Clay Shirky ở đâu

Đây là một bí danh được thực hiện tốt, nhưng tôi không chắc tại sao bạn lại muốn làm điều này ngay từ đầu. Thỉnh thoảng bạn sẽ phải đối phó với những thay đổi, phải không? Bạn sẽ có thể hủy bỏ phần hợp nhất git pullnếu bạn không thích những gì nó đang làm ... vì vậy tôi không chắc trường hợp sử dụng cho việc này là gì.
Marnen Laibow-Koser 18/03/19

Tôi biết rằng tôi phải đối phó với những thay đổi tại một số điểm, nhưng như tôi đã viết, đôi khi tôi không muốn. Tôi chỉ muốn biết nếu một cái gì đó sẽ phá vỡ và tôi phải dành thêm một chút thời gian cho việc này - hoặc nếu tôi có thể làm một việc git pullsau đó. Ngoài ra tôi nghĩ đó là những gì câu hỏi của op là về.
Andy P

-1

Nếu bạn không muốn git-fetch cập nhật .git cục bộ của mình, chỉ cần sao chép repo cục bộ của bạn vào thư mục tạm thời và thực hiện thao tác đó. Đây là một bàn tay:

$ alias gtp="tar -c . | (cd /tmp && mkdir tp && cd tp && tar -x && git pull; rm -rf /tmp/tp)"

Ví dụ.:

$ git status
# On branch master
nothing to commit (working directory clean)

$ gtp
remote: Finding sources: 100% (25/25)
remote: Total 25 (delta 10), reused 25 (delta 10)
Unpacking objects: 100% (25/25), done.
From ssh://my.git.domain/reapO
   32d61dc..05287d6  master     -> origin/master
Updating 32d61dc..05287d6
Fast-forward
 subdir/some.file       |    2 +-
 .../somepath/by.tes    |    3 ++-
 .../somepath/data      |   11 +++++++++++
 3 files changed, 14 insertions(+), 2 deletions(-)

$ git status
# On branch master
nothing to commit (working directory clean)

$ git fetch
remote: Finding sources: 100% (25/25)
remote: Total 25 (delta 10), reused 25 (delta 10)
Unpacking objects: 100% (25/25), done.
From ssh://my.git.domain/reapO
   32d61dc..05287d6  master     -> origin/master

$ git status
# On branch master
# Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.
#
nothing to commit (working directory clean)

'gtp' cần được thực thi trong thư mục gốc của repo cục bộ, nơi .git được đặt.
Phòng thí nghiệm AX

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.