2008-09-14 16 views
61

Tôi muốn kịch bản, tốt nhất trong cào, các hành động sau đây vào một lệnh duy nhất:Làm cách nào để tạo ra sự khác biệt về những gì đã thay đổi kể từ lần cuối cùng tôi kéo?

  1. Lấy phiên bản của kho git địa phương của tôi.
  2. Git lấy mã mới nhất.
  3. Git khác với phiên bản tôi đã trích xuất ở bướC# 1 đến nội dung hiện có trong kho lưu trữ cục bộ của tôi.

Nói cách khác, tôi muốn lấy mẫu mã mới nhất của kho lưu trữ trung tâm và ngay lập tức tạo ra sự khác biệt về những gì đã thay đổi kể từ lần cuối cùng tôi kéo.

Trả lời

70

Bạn có thể thực hiện điều này khá đơn giản bằng cách phân tách.

git pull origin 
git diff @{1}.. 

Điều đó sẽ cho bạn một điểm khác biệt của nhánh hiện tại như đã tồn tại trước và sau khi kéo. Lưu ý rằng nếu pull không thực sự cập nhật nhánh hiện tại, diff sẽ cho bạn kết quả sai. Một lựa chọn khác là để ghi lại một cách rõ ràng phiên bản hiện tại:

current=`git rev-parse HEAD` 
git pull origin 
git diff $current.. 

Cá nhân tôi sử dụng một bí danh mà đơn giản chỉ ra cho tôi một bản ghi, theo thứ tự ngược (tức là lâu đời nhất đến mới nhất), sans sáp nhập, của tất cả các cam kết kể từ kéo cuối cùng của tôi . Tôi chạy này mỗi khi kéo tôi cập nhật các chi nhánh:

git config --global alias.lcrev 'log --reverse --no-merges --stat @{1}.. 
+0

'git diff HEAD' cũng hoạt động. (Có lẽ 4 năm trước nó không ...) – leemes

+1

@leemes: Hmm? 'git diff HEAD' sẽ hiển thị cho bạn những gì đã thay đổi giữa HEAD và bản sao làm việc hiện tại của bạn. Đó không phải là những gì Teflon Ted đang yêu cầu. –

+0

Xin lỗi, tôi đã hiểu sai câu hỏi. Tôi đang tìm kiếm một lệnh để hiển thị những thay đổi của tôi kể từ lần cuối cùng tôi kéo và hạ cánh xuống đây. 'git diff HEAD' làm việc cho những gì tôi cần (ít nhất tôi đoán rằng đó là những gì tôi đang tìm kiếm: D) – leemes

10

Điều này rất giống với câu hỏi tôi đã hỏi về how to get changes on a branch in git. Lưu ý rằng hành vi của git diff so với git log khác nhau khi sử dụng hai dấu chấm so với ba dấu chấm. Tuy nhiên, đối với đơn đăng ký của bạn, bạn có thể sử dụng:

git fetch 
git diff ...origin 

Sau đó, git pull sẽ hợp nhất các thay đổi vào HEAD của bạn.

+0

Tôi không thấy nguồn gốc được xác định là từ khóa đặc biệt cho git-diff hoặc git-rev-parse. Ý của bạn là tôi cần phải băm băm từ bướC# 1 làm giá trị cho xuất xứ? Nếu vậy, làm thế nào để tôi lập trình trích xuất giá trị đó? Tôi muốn kết hợp tất cả các bước này thành một lệnh/tập lệnh để thuận tiện. –

+2

Một cách khác để thực hiện việc này là sử dụng đầu FETCH_HEAD đặc biệt, phản ánh kết quả của lần tìm nạp trước đó. Vì vậy: "git fetch && git diff ... FETCH_HEAD". –

+0

Tôi nghĩ rằng đây là câu trả lời phù hợp hơn: 'git fetch' theo sau là một' git diff origin/branchname' là cách tốt nhất để kiểm tra sự khác biệt trước khi kéo. –

12

Greg's cách hoạt động (không phải tôi, khác Greg: P). Về nhận xét của bạn, nguồn gốc là một biến cấu hình được thiết lập bởi Git khi bạn sao chép kho lưu trữ trung tâm vào máy cục bộ của bạn. Về cơ bản, một kho lưu trữ Git nhớ nó đến từ đâu. Tuy nhiên, bạn có thể đặt các biến này theo cách thủ công nếu bạn cần sử dụng git-config.

git config remote.origin.url <url> 

trong đó url là đường dẫn từ xa đến kho lưu trữ trung tâm của bạn.

Dưới đây là một tệp mẫu ví dụ sẽ hoạt động (tôi chưa thử nghiệm nó).

@ECHO off 

:: Retrieve the changes, but don't merge them. 
git fetch 

:: Look at the new changes 
git diff ...origin 

:: Ask if you want to merge the new changes into HEAD 
set /p PULL=Do you wish to pull the changes? (Y/N) 
IF /I %PULL%==Y git pull 
+1

Thông thường, bạn sẽ sử dụng 'git remote set-url origin ' thay vì 'git config' để thay đổi URL cho một từ xa Git * *. Có sự khác biệt nào không? Tôi không biết, nhưng có vẻ như 'git remote' là một công cụ thích hợp hơn cho công việc. –

+0

@ColinDBennett Bạn nói đúng, 'git remote set-url' sẽ là cách thích hợp hơn để thực hiện nó. Tôi đã sử dụng 'git config' vì' set-url' không phải là một tùy chọn khi tôi viết bài này. – Greg

4

Nếu bạn thả này vào bash của bạn, quý khách sẽ có thể chạy nụ cười (git từ xa đến) và vữa (git remote đi) để xem diffs của cam kết là đến và đi cho chủ gốc.

function parse_git_branch { 
    git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/' 
} 
function gd2 { 
echo branch \($1\) has these commits and \($2\) does not 
git log $2..$1 --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local 
} 
function grin { 
git fetch origin master 
gd2 FETCH_HEAD $(parse_git_branch) 
} 
function grout { 
git fetch origin master 
gd2 $(parse_git_branch) FETCH_HEAD 
} 
+0

Gd2 là gì? Một số loại bí danh để git diff? – arved

+0

Đó là một hàm bash được định nghĩa trong tập lệnh ở trên ngay sau khi parse_git_branch – Clintm