git phía trước / phía sau thông tin giữa chủ và chi nhánh?


201

Tôi đã tạo một chi nhánh để thử nghiệm trong repo địa phương của tôi (test-branch ) mà tôi đã đẩy tới Github.

Nếu tôi truy cập vào Githubtài khoản của mình và chọn mục này, test-branchnó sẽ hiển thị thông tin:

This branch is 1 commit ahead and 2 commits behind master

Câu hỏi của tôi là:

  1. Làm cách nào tôi có thể hiển thị thông tin này cục bộ (ví dụ: một lệnh hiển thị thông tin này trên thiết bị đầu cuối, thay vì phải mở Github để xem thông tin này)?
  2. Tôi biết tôi có thể thấy sự khác biệt giữa các chi nhánh bằng cách sử dụng:

    git diff master..test-branch
    

    hoặc sử dụng Meld(mà tôi thích):

    git difftool master..test-branch
    

    nhưng tôi đã tự hỏi nếu có một cách để xem phía trướcphía sau cam kết riêng biệt. IE: có cách nào để chỉ ra rằng 1 cam kết đi trước và sau đó 2 cam kết phía sau không?



1
Git 2.5+ (quý 2 năm 2015) sẽ giới thiệu git for-each-ref --format="%(push:track)" refs/heads. Xem câu trả lời của tôi dưới đây
VonC

1
Bởi vì tôi không thể tìm thấy câu hỏi này bằng cách sử dụng các từ khóa tôi sắp viết, tôi chỉ muốn lưu ý rằng số tiền này để lấy phần bù tương đối (hoặc "đặt chênh lệch") giữa các bộ xác nhận tạo nên các nhánh đó (và sau đó đếm các yếu tố). Hy vọng điều này làm cho nó vào các chỉ số công cụ tìm kiếm.
pmos

Câu trả lời:


309

Đây là một mẹo tôi tìm thấy để so sánh hai nhánh và cho biết mỗi nhánh có bao nhiêu lần cam kết trước nhánh kia (câu trả lời tổng quát hơn cho câu hỏi của bạn 1):

Đối với các chi nhánh địa phương : git rev-list --left-right --count master...test-branch

Đối với các chi nhánh từ xa : git rev-list --left-right --count origin/master...origin/test-branch

Điều này cho đầu ra như sau:

1 7

Đầu ra này có nghĩa là: "So với master, test-branchlà 7 cam kết phía trước và 1 cam kết phía sau."

Bạn cũng có thể so sánh các chi nhánh địa phương với các chi nhánh từ xa, ví dụ origin/master...masterđể tìm hiểu có bao nhiêu cam kết masterchi nhánh địa phương đi trước / sau đối tác từ xa của nó.


1
Đây là một giải pháp tuyệt vời để tôi tìm hiểu xem tôi có thể xóa một chi nhánh hay nếu nó vẫn đi trước phát triển.
Maverick1st

1
@ Maverick1st, vâng, lệnh này đặc biệt hữu ích khi bạn đang theo quy trình công việc gitflow (mà tôi)
user1834095

2
Đây là cách tốt nhất cho trường hợp sử dụng của tôi để tìm kiếm nếu nhánh tính năng hiện tại của bạn đứng sau remote master ( git rev-list --left-right --count origin/master...@) - miễn là người dùng làm git fetchtrước đó; hữu ích để ngăn chặn các yêu cầu kéo từ các chi nhánh lỗi thời.
jakub.g

9
Để kiểm tra xem có bao nhiêu cam kết phía sau là chi nhánh hiện tại:git rev-list --left-right --count origin/master...@ | cut -f1
jakub.g

8
@ jakub.g bạn không cần phải cắt nếu bạn sử dụng --left-onlyhoặc--right-only
jasonkarns

39

Trước hết để xem bạn có bao nhiêu phiên bản phía sau, bạn nên thực hiện git fetchđể đảm bảo bạn có thông tin mới nhất từ ​​xa.

Đầu ra mặc định git statuscho bạn biết bạn đang ở phía trước hoặc phía sau bao nhiêu phiên bản, nhưng thông thường tôi thấy điều này quá dài dòng:

$ git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 1 different commit each, respectively.
#
nothing to commit (working directory clean)

Tôi thích git status -sb:

$ git status -sb
## master...origin/master [ahead 2, behind 1]

Trong thực tế, tôi đặt bí danh này cho đơn giản git s, và đây là lệnh chính tôi sử dụng để kiểm tra trạng thái.

Để xem sự khác biệt trong "phiên bản trước" của master, tôi có thể loại trừ "bản sửa đổi phía sau" khỏi origin/master:

git diff master..origin/master^

Để xem sự khác biệt trong "bản sửa đổi phía sau" của origin/master, tôi có thể loại trừ "bản sửa đổi trước" khỏi master:

git diff origin/master..master^^

Nếu có 5 bản sửa đổi phía trước hoặc phía sau, có thể dễ dàng viết như thế này:

git diff master..origin/master~5
git diff origin/master..master~5

CẬP NHẬT

Để xem các phiên bản trước / sau, nhánh phải được cấu hình để theo dõi nhánh khác. Đối với tôi đây là hành vi mặc định khi tôi sao chép một kho lưu trữ từ xa và sau khi tôi đẩy một nhánh với git push -u remotename branchname. Phiên bản của tôi là 1.8.4.3, nhưng nó vẫn hoạt động như thế này miễn là tôi nhớ.

Kể từ phiên bản 1.8, bạn có thể đặt nhánh theo dõi như thế này:

git branch --track test-branch

Kể từ phiên bản 1.7, cú pháp khác nhau:

git branch --set-upstream test-branch

Phiên bản gitnào bạn đang sử dụng? Tôi không thể tái tạo những gì bạn nhận được với hoặc git statuscũng không git status -sb. Nếu tôi thử một trong hai lệnh (sau khi thực hiện git fetch), tôi sẽ không nhận được bất kỳ thông tin nào về các cam kết trước / sau.
Gabriel

8
Cách của bạn để xem các cam kết phía trước và phía sau được áp dụng masterorigin/mastervà tôi muốn thấy các khác biệt đó cho mastervà một nhánh khác test-branch. Bạn có thể định dạng lại câu trả lời của bạn giải quyết vấn đề này?
Gabriel

Sự khác biệt trong các phiên bản "phía sau" và "phía trước" chỉ hoạt động đối với tôi nếu tôi sử dụng 3 dấu chấm giữa các tên nhánh (không phải 2). Và ^ và ^^ dường như không quan trọng ở đây Eg: git diff master ... origin / master git diff origin / master ... master Anyways, "git status -sb" rất hữu ích.
Vituel

10

Với Git 2.5+, giờ đây bạn có một tùy chọn khác để xem trước / sau cho tất cả các nhánh được định cấu hình để đẩy sang một nhánh.

git for-each-ref --format="%(push:track)" refs/heads

Xem thêm tại " Xem Cam kết Git chưa được chỉnh sửa "


Bạn có thể làm điều này cho chi nhánh hiện tại và chi nhánh theo dõi từ xa không?
spex

@spex có: hoàn thành refs/headsvới tên của chi nhánh hiện tại ( stackoverflow.com/a/12142066/6309 ):refs/heads/$(git rev-parse --abbrev-ref HEAD)
VonC

3

Bạn cũng có thể sử dụng awkđể làm cho nó đẹp hơn một chút:

git rev-list --left-right --count  origin/develop...feature-branch | awk '{print "Behind "$1" - Ahead "$2""}'

Bạn thậm chí có thể tạo một bí danh luôn tìm nạp nguồn gốc trước và sau đó so sánh các nhánh

commit-diff = !"git fetch &> /dev/null && git rev-list --left-right --count"

1

Sau khi thực hiện tìm nạp git, bạn có thể chạy trạng thái git để hiển thị số lần xác nhận chi nhánh địa phương ở phía trước hoặc phía sau phiên bản từ xa của chi nhánh.

Điều này sẽ không cho bạn thấy có bao nhiêu cam kết ở phía trước hoặc phía sau của một chi nhánh khác. Các tùy chọn của bạn là khác hoàn toàn, nhìn vào github hoặc sử dụng giải pháp như Vimhsa được liên kết ở trên: Trạng thái Git trên tất cả các repo

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.