Git - đẩy phím tắt hiện tại


363

Có một phím tắt để nói với Git để đẩy nhánh theo dõi hiện tại về nguồn gốc không?
Lưu ý: Tôi biết rằng tôi có thể thay đổi hành vi đẩy mặc định , nhưng tôi đang tìm kiếm một giải pháp đặc biệt không thay đổi hành vi mặc định.

Ví dụ: giả sử tôi ở chi nhánh feature/123-sandbox-teststôi sẽ sử dụng

git push origin feature/123-sandbox-tests

đó là tẻ nhạt. Tôi đang tìm kiếm một phím tắt, một cái gì đó như

git push origin current

nơi git biết rằng hiện tại là feature/123-sandbox-tests.


Chỉnh sửa : Bắt đầu từ phiên bản 2.0, hành vi mặc định của git đã thay đổi thành hành vi trực quan hơn, đó là điều tôi muốn đạt được. Xem câu hỏi SO này để biết chi tiết.

Chỉnh sửa 2 : Câu trả lời của ceztko là câu trả lời tốt nhất vì nó cho phép đẩy chi nhánh hiện tại, bất kể cài đặt.

Câu trả lời:


702

Theo git pushtài liệu:

git push origin HEAD
    A handy way to push the current branch to the same name on the remote.

Vì vậy, tôi nghĩ rằng những gì bạn cần là git push origin HEAD. Ngoài ra, có thể hữu ích git push -u origin HEADkhi thiết lập thông tin theo dõi ngược dòng trong nhánh cục bộ, nếu bạn chưa được đẩy về nguồn gốc.


11
Tôi thích điều này hơn là cài đặt push.default thành đơn giản hoặc hiện tại, bởi vì các máy khác nhau có thể có các cài đặt khác nhau. Bạn có thể quen với việc git pushchỉ đẩy chi nhánh hiện tại, nhưng trên các máy khác, bạn có thể vô tình đẩy tất cả các chi nhánh phù hợp.
wvducky

1
@wisbucky Tôi có một số bí danh, bao gồm co, vì vậy nếu tôi cố gắng thậm chí kéo xuống và sau đó kiểm tra mã mà không có ~/.gitconfigtệp của tôi trên VM đó, tôi sẽ biết ngay lập tức. Điều đó cho phép tôi cảm thấy khá an toàn về việc thay đổi mặc định đẩy sang upstream.
Damon

9
Điều thú vị là điều này không hoạt động với chỉ @, được ghi nhận là bí danh hợp lệ HEAD. (ví dụ git push -u origin @)
void.pulum

197

Bạn có thể cấu hình git để đẩy đến nhánh hiện tại bằng lệnh sau

git config --global push.default current

sau đó chỉ cần làm

git push 

điều này sẽ đẩy mã đến chi nhánh hiện tại của bạn.


Có ý nghĩa gì khi thêm push = refs/heads/current:refs/for/master/currentvào phần 'từ xa' trong .git / config? Đó là, "hiện tại" là một từ đặc biệt ở đây? Hay nó sẽ tìm kiếm một nhánh gọi là "hiện tại"?
David Doria

6
@DavidDoria 'hiện tại' không phải là một chi nhánh có tên ở đây.
Mahesh

Tốt nhất làm git push -u origin feature_branch_nameđể thiết lập ngược dòng / theo dõi! Nếu bạn sử dụng một kho lưu trữ từ xa ít nhất.
Flo

40

Bạn nên xem một câu hỏi tương tự trong Hành vi mặc định của "git đẩy" mà không có chi nhánh được chỉ định

Về cơ bản, nó giải thích cách thiết lập hành vi mặc định để đẩy chi nhánh hiện tại của bạn chỉ thực thi git push. Có lẽ những gì bạn cần là:

git config --global push.default current

Sự lựa chọn khác:

  • không có gì : Đừng đẩy bất cứ điều gì
  • khớp : Đẩy tất cả các nhánh khớp
  • ngược dòng / theo dõi : Đẩy chi nhánh hiện tại đến bất cứ thứ gì nó đang theo dõi
  • hiện tại : Đẩy chi nhánh hiện tại

11

Tôi sử dụng bí danh như vậy trong cấu hình .bashrc của tôi

alias gpb='git push origin `git rev-parse --abbrev-ref HEAD`'

Trên lệnh, $gpbnó lấy tên nhánh hiện tại và đẩy nó về gốc.

Đây là những bí danh khác của tôi:

alias gst='git status'
alias gbr='git branch'
alias gca='git commit -am'
alias gco='git checkout'

8

Đối với những gì nó có giá trị, các phím tắt cuối cùng:

Trong tôi .bash_profilealias push="git push origin HEAD", vì vậy bất cứ khi nào tôi gõ pushtôi đều biết mình đang đẩy sang chi nhánh hiện tại.


6

Nếu bạn đang sử dụng git 1.7.x, bạn có thể chạy lệnh sau để đặt nhánh theo dõi từ xa.

git branch --set-upstream feature/123-sandbox-tests origin/feature/123-sandbox-tests

Sau đó, bạn có thể chỉ cần sử dụng git pushđể đẩy tất cả các thay đổi. Để có câu trả lời đầy đủ hơn, vui lòng xem câu trả lời được chấp nhận cho một câu hỏi tương tự ở đây.

Nếu bạn chỉ muốn đẩy nhánh hiện tại bằng lệnh đẩy, thì bạn có thể thay đổi hành vi đẩy thành ngược dòng:

git config --global push.default upstream

Cảm ơn, tuy nhiên trong trường hợp này, TẤT CẢ các nhánh theo dõi sẽ được đẩy về nguồn gốc?
Elad

Tôi đã sửa đổi câu trả lời, xin vui lòng xem liên kết, câu trả lời là đầy đủ hơn ở đó.
Faruk Sahin

Một lần nữa, vấn đề là tất cả các nhánh mà các nhánh đang theo dõi đang bị đẩy theo cách đó. Như tôi đã viết trong câu hỏi của mình, nhánh là một nhánh được theo dõi ở vị trí đầu tiên, vì vậy tôi nghĩ rằng việc thiết lập nhánh ngược dòng như bạn đề xuất là không cần thiết. Hoặc là tôi sai?
Elad

Sau đó, bạn có thể định cấu hình git để chỉ đẩy nhánh hiện tại bằng cách thay đổi hành vi đẩy git. git config --global push.default upstreamsẽ thiết lập hành vi đẩy để chỉ đẩy chi nhánh hiện tại.
Faruk Sahin

5

Cách đơn giản nhất: chạy git push -u origin feature/123-sandbox-testsmột lần. Điều đó đẩy chi nhánh theo cách bạn đã từng làm và cũng đặt thông tin theo dõi ngược dòng trong cấu hình cục bộ của bạn. Sau đó, bạn có thểgit push đẩy các nhánh được theo dõi đến (các) điều khiển từ xa ngược dòng của chúng.

Bạn cũng có thể tự thực hiện việc này trong cấu hình bằng cách đặt thành branch.<branch name>.mergetên nhánh từ xa (trong trường hợp của bạn giống với tên cục bộ) và tùy ý, branch.<branch name>.remotetheo tên của điều khiển từ xa mà bạn muốn đẩy (mặc định là gốc). Nếu bạn nhìn vào cấu hình của mình, rất có thể đã có một trong những thiết lập này master, vì vậy bạn có thể làm theo ví dụ đó.

Cuối cùng, hãy chắc chắn rằng bạn xem xét các push.defaultthiết lập. Nó mặc định là "khớp", có thể có kết quả không mong muốn và không mong muốn. Hầu hết những người tôi biết đều tìm thấy "thượng nguồn" trực quan hơn, chỉ đẩy chi nhánh hiện tại.

Chi tiết về từng cài đặt này có thể được tìm thấy trong trang man git-config .

Về ý nghĩ thứ hai, khi đọc lại câu hỏi của bạn, tôi nghĩ bạn biết tất cả những điều này. Tôi nghĩ những gì bạn thực sự tìm kiếm không tồn tại. Làm thế nào về một chức năng bash một cái gì đó như (chưa được kiểm tra):

function pushCurrent {
  git config push.default upstream
  git push
  git config push.default matching
}

1

Với sự giúp đỡ của câu trả lời của ceztko, tôi đã viết chức năng trợ giúp nhỏ này để làm cho cuộc sống của tôi dễ dàng hơn:

function gpu()
{
    if git rev-parse --abbrev-ref --symbolic-full-name @{u} > /dev/null 2>&1; then
        git push origin HEAD
    else
        git push -u origin HEAD
    fi
}

Nó đẩy nhánh hiện tại về nguồn gốc và cũng đặt nhánh theo dõi từ xa nếu nó chưa được thiết lập.

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.