git thêm, cam kết và đẩy các lệnh trong một?


220

Có cách nào để sử dụng ba lệnh này trong một không?

git add .
git commit -a -m "commit" (do not need commit message either)
git push

Đôi khi tôi chỉ thay đổi một chữ cái, đệm CSS hoặc một cái gì đó. Tuy nhiên, tôi phải viết cả ba lệnh để thay đổi. Có nhiều dự án mà tôi chỉ có một người đẩy, vì vậy lệnh này sẽ rất tuyệt!


10
Bạn đã thử viết một kịch bản shell?
Paul


Có rất nhiều thay đổi trong mã của tôi, khi bạn thay đổi chỉ là một phần đệm trong css, hoặc một chữ cái, v.v. Tin nhắn cam kết và tất cả các lệnh này sẽ bổ sung rất nhiều công việc. Không thử một kịch bản shell. Làm thế nào nó có thể được thực hiện? Cảm ơn!
Gediminas

2
"(cũng không cần thông điệp cam kết)" hình ảnh.wikia.com/dragonball/images/a/a7/Facepalm_227785.jpg
Ajedi32

2
nếu bạn đang thực hiện một cam kết cho mỗi trường hợp thay đổi, bạn đang thực hiện sai. thực hiện lệnh khi tính năng của bạn kết thúc hoặc lỗi được khắc phục (đây có thể là một thay đổi duy nhất)
Đánh dấu

Câu trả lời:


234

Xây dựng câu trả lời của @ Gavin:

Làm cho lazygit một hàm thay vì bí danh cho phép bạn truyền cho nó một đối số. Tôi đã thêm phần sau vào .bashrc (hoặc .bash_profile nếu Mac):

function lazygit() {
    git add .
    git commit -a -m "$1"
    git push
}

Điều này cho phép bạn cung cấp một thông điệp cam kết, chẳng hạn như

lazygit "My commit msg"

Tất nhiên, bạn có thể tăng cường điều này hơn nữa bằng cách chấp nhận nhiều đối số hơn, chẳng hạn như nơi nào để đẩy đến hoặc chi nhánh nào.


10
Khởi động lại không cần thiết, chỉ cần làm "nguồn .bashrc"
Sambit Tripathy

25
có thể sử dụng $*thay vì $1để lưu các trích dẫn:lazygit My commit msg
Kai Carver

16
@KaiCarver Nghĩ hay, nhưng cá nhân tôi không thích nó. Nó ngăn bạn sử dụng nhiều đối số và cũng đi ngược lại quy ước thông thường của một chuỗi đối số với các khoảng trắng được gói trong dấu ngoặc kép. Đây là bản chất thứ hai đối với tôi tại thời điểm này (và tôi sẽ đảm nhận rất nhiều nhà phát triển). Để lại các trích dẫn cảm thấy bẩn.
btse

6
lazygit, tên tốt nhất bao giờ hết!
dùng1447414

4
@btse tôi là một người ngoại giao + thứ sáu. Đây là chức năng sử dụng đề xuất @KaiCarver: function dirtygit() { git add . git commit -a -m "$*" git push }
OnklMaps

84

Tôi đã kết thúc việc thêm một bí danh vào .gitconfigtập tin của mình :

[alias]
    cmp = "!f() { git add -A && git commit -m \"$@\" && git push; }; f"

Sử dụng: git cmp "Long commit message goes here"

Thêm tất cả các tệp, sau đó sử dụng nhận xét cho thông điệp cam kết và đẩy nó lên nguồn gốc.

Tôi nghĩ đó là một giải pháp tốt hơn bởi vì bạn có quyền kiểm soát thông điệp cam kết là gì.

Bí danh cũng có thể được xác định từ dòng lệnh, điều này thêm nó vào .gitconfig:

git config --global alias.cmp '!f() { git add -A && git commit -m "$@" && git push; }; f'

6
Đó chính xác là những gì tôi đang tìm kiếm! Hoạt động hoàn hảo, cảm ơn! Tôi không thể tìm thấy một tham chiếu cú ​​pháp đầy đủ hoặc một danh sách chi tiết các lệnh. Làm gì !f() { ... }; fchính xác? Giải thích thêm về dòng đó sẽ làm cho câu trả lời thậm chí tốt hơn.
Dmitriy Gamolin

1
@DmitriyDemir Nó xác định hàm f, sau đó gọi nó.
Oliver

Hoạt động thực sự tốt. Tôi đã thêm vào git pullđầu để giảm bớt sự hợp nhất.
Burhan

1
@Oliver Tại sao nó được trích dẫn? Tại sao có một dấu chấm than? Có f ở cuối gọi hàm không? "$ @" Là gì?
Philip Rego

@PhilipRego Sai Oliver: p
Oliver

53

Mặc dù tôi đồng ý với Wayne Werner về những nghi ngờ của anh ấy, nhưng về mặt kỹ thuật, đây là một lựa chọn:

git config alias.acp '! git commit -a -m "commit" && git push'

Mà định nghĩa một bí danh chạy commitpush. Sử dụng nó như git acp. Xin lưu ý rằng các bí danh "shell" như vậy luôn được chạy từ thư mục gốc của kho git của bạn.

Một lựa chọn khác có thể là viết một hook hook cam kết thực hiện việc đẩy.

Ồ, nhân tiện, bạn thực sự có thể truyền các đối số cho các bí danh shell. Nếu bạn muốn truyền thông điệp cam kết tùy chỉnh, thay vào đó hãy sử dụng:

git config alias.acp '! acp() { git commit -a -m "$1" && git push ; } ; acp'

(Tất nhiên, bây giờ, bạn sẽ cần đưa ra một thông điệp cam kết git acp "My message goes here!":)


@wlz Mình mới dùng thử và nó hoạt động tốt. Lưu ý rằng toàn bộ chuỗi nằm trong dấu ngoặc đơn. gittự động thêm các lối thoát (được kiểm tra với git config -e).
Tilman Vogel

Xin lỗi, bạn nói đúng :). Tôi trực tiếp chỉnh sửa tập tin .gitconfig. "Đã thoát với \".
wlz

2
Tại sao đây không phải là câu trả lời được chấp nhận? Nó làm những gì đã được hỏi. +1.
lucid_dreamer

1
Trên Windows, tôi cần thoát khỏi dấu ngoặc kép khoảng 1 đô la để khiến nó hoạt động từ PowerShell (sử dụng ... \ "$ 1 \" ...)
DReimer

35

Tôi nghĩ rằng bạn có thể hiểu sai quy trình công việc mà git được thiết kế cho. (Để làm rõ / sửa những gì tôi muốn nói trong bình luận, bạn không cần git add ., vì commit -athường phục vụ cùng một mục đích - thêm bất kỳ thay đổi nào chưa được tổ chức, nếu các tệp đã được thêm vào)

Thông thường bạn sẽ làm một cái gì đó như thế này:

# make some changes
$ git commit -a -m "Changed something"
# make some more changes
$ git commit -a -m "Changed something else"

rửa, rửa, lặp lại, cho đến khi bạn hoàn thành tính năng X hoặc bạn đang ở điểm dừng hoặc bạn chỉ muốn người khác thấy những gì bạn đã làm. Sau đó bạn làm

$ git push

Git không phải là SVN - nhưng có vẻ như bạn đang cố gắng sử dụng nó như vậy. Bạn có thể tìm thấy một số tài nguyên ở cuối bài viết ở đây để sử dụng.


6
+1 cho lời giải thích về quy trình làm việc. Tuy nhiên git add .git commit -a không phải là điều tương tự
Gabriele Petronella

5
Cảm ơn đã giải thích, nhưng GIT sẽ không sụp đổ nếu sẽ có một lệnh như thế này cho những người biết họ đang làm gì ...
Gediminas

4
@Lucas: Các lập trình viên có kinh nghiệm sẽ nói với bạn rằng những người yêu cầu lệnh tự động cam kết không biết họ đang làm gì. Có một lý do để kiểm tra mã 3 giai đoạn (nếu bạn đang sử dụng các nhánh tính năng, 4 giai đoạn).
slebetman

1
@slebetman: Tôi đã không giải thích chính xác. Với các ứng dụng facebook, mọi thay đổi phải được triển khai cho máy chủ trực tiếp ngay cả để phát triển. Vì vậy, chúng tôi đã thiết lập hook hook để làm điều đó. Bạn thực hiện một thay đổi, cam kết và xem sự thay đổi trong ứng dụng của bạn. Với git, tôi cần thêm, giai đoạn sau đó đẩy nó để thấy một thay đổi duy nhất. Trông nó có quá mức không?
SenG

1
Có, nhưng bạn cũng không cần phải cam kết kiểm tra mã của mình. Bạn nên viết một số mã, kiểm tra nó, sau đó cam kết và đẩy. Việc sử dụng huyền thoại của git cục bộ cam kết cung cấp một số loại chức năng "hoàn tác" đa tệp được sử dụng nhiều hơn trong truyền thuyết so với thực tế, theo kinh nghiệm của tôi.
Joe Strout

35

Tôi sử dụng điều này trong .bash_profile của tôi

gitpush() {
    git add .
    git commit -m "$*"
    git push
}
alias gp=gitpush

Nó thực thi như

gp A really long commit message

Đừng quên chạy source ~/.bash_profilesau khi lưu bí danh.


1
Tôi thực sự thích điều này. ... và do đó đã chấp nhận nó vào riêng tôi ~ / .bash_profile;) cảm ơn .. +1
AO_

28

Bạn có thể sử dụng tập lệnh bash, đặt bí danh để khởi chạy bất kỳ lệnh hoặc nhóm lệnh nào

git commit -am "your message" && git push 

2
Nếu bạn muốn làm cho câu trả lời này, xin vui lòng thêm bình luận xung quanh cách nó hoạt động. Câu trả lời đơn giản là một bãi chứa mã thường không được đón nhận. Xem cách trả lời .
Khỉ Heretic

Tôi nghĩ rằng đây nên là câu trả lời chính xác. Khi nó trả lời câu hỏi ngắn gọn nhất có thể. Chỉ cần gõ nó vào thiết bị đầu cuối và nó hoạt động! Nếu bạn không muốn thêm bí danh, một cách khác chỉ đơn giản là tạo một bản mở rộng textExpander và kích hoạt nó thông qua tổ hợp phím.
eonist

19

Đặt làm bí danh trong bash:

$ alias lazygit="git add .; git commit -a -m '...'; git push;";

Gọi nó đi:

$ lazygit

(Để đặt bí danh này vĩnh viễn, bạn phải đưa nó vào .bashrc hoặc .bash_profile của bạn)


Bạn sẽ cần thêm bí danh đó vào .bashrc hoặc .bash_profile để biến nó thành vĩnh viễn
Gavin

Tôi nghĩ rằng trang này có thể giúp giải thích: serverfault.com/questions/3743/ Khăn
Gavin

17

Giải pháp đơn giản nhất sẽ là:

git commit -a -m "commit" && git push

git add đã được chứa trong -a tham số của cam kết, nhưng nếu bạn muốn, bạn có thể kết nối tất cả chúng:

git add . && git commit -a -m "commit" && git push

10

Trong Linux / Mac, tùy chọn thực tế này cũng sẽ hoạt động

git commit -am "IssueNumberIAmWorkingOn --hit Enter key
> A detail here --Enter
> Another detail here --Enter
> Third line here" && git push --last Enter and it will be there

Nếu bạn đang làm việc trên một nhánh mới được tạo cục bộ, hãy thay đổi git pushphần đó bằnggit push -u origin branch_name

Nếu bạn muốn chỉnh sửa thông điệp cam kết của mình trong trình chỉnh sửa hệ thống thì

git commit -a && git push 

sẽ mở trình soạn thảo và một khi bạn lưu tin nhắn, nó cũng sẽ đẩy nó.


8

Bạn có thể thử gitu .

Lần đầu tiên (nút js phải được cài đặt):

npm install -g git-upload

Sau đó:

gitu COMMIT_MSG

Để ban hành ba lệnh đó cùng một lúc.

Điều tốt là bạn không phải lo lắng khi bạn cài đặt lại hệ thống của mình hoặc khi bạn muốn làm điều này trên các máy tính khác nhau và không cần sửa đổi tập tin. Điều này cũng hoạt động trên các nền tảng khác nhau (không chỉ Linux và Mac, mà cả Windows dưới dấu nhắc lệnh như cmdpowershell) chỉ là bạn phải cài đặt npmnodejs( gittất nhiên).


6

Nếu tệp đã được theo dõi thì bạn không cần phải chạy git add, bạn chỉ cần viếtgit commit -am 'your message'

Nếu bạn không muốn viết một thông điệp cam kết, bạn có thể cân nhắc làm một cái gì đó như

git commit --allow-empty-message -am ''



3

Như đã đề cập trong câu trả lời này , bạn có thể tạo bí danh git và gán một bộ lệnh cho nó. Trong trường hợp này, nó sẽ là:

git config --global alias.add-com-push '!git add . && git commit -a -m "commit" && git push'

và sử dụng nó với

git add-com-push

1
Điều này không thêm bất cứ điều gì vào bất kỳ câu trả lời trước.
BanksySan

Tôi xin lỗi, bạn nói đúng. Tôi nghĩ rằng tôi đã không nhận thấy rằng câu trả lời của Tilman Vogel giống như của tôi .. Tôi có nên xóa nó không ??
cristianzamar

3

Viết một đoạn script nhỏ có tên gitpush.sh với các dòng bên dưới và thêm nó vào thư mục ~ của bạn.

echo $1
git add .
git commit -m "$1"
git push

Bây giờ thêm một bí danh trong ~ / .bashrc như dưới đây:

alias gitpush='~/gitpush'

Bây giờ từ bất kỳ kho lưu trữ git chỉ cần viết "tin nhắn" gitpush.


2

Tôi sử dụng một tệp bó:

@ECHO OFF
SET /p comment=Comment:
git add *
git commit -a -m "%comment%"
git push

probs sẽ dễ dàng hơn nếu bạn chấp nhận trong args từ dòng lệnh. tôi chỉ đơn giản là đi "lezygit MESSAGE", vv nó khá tuyệt!
John Hon

1

Có một số vấn đề với các kịch bản ở trên:

shift "loại bỏ" tham số $ 1, nếu không, "đẩy" sẽ đọc nó và "hiểu nhầm".

Mẹo của tôi:

git config --global alias.acpp '! git add -A && Branchatu = "$ (git Symbolic-ref Head 2> / dev / null)" && Branchatu = $ {Branchatu ## refs / Heads /} && git commit - m "$ 1" && shift && git pull -u origin $ Branchatu && git push -u origin $ Branchatu '


1

Khi bạn muốn hành vi giống như svn của git commit, hãy sử dụng điều này trong bí danh git của bạn trong .gitconfig

commit = "!f() { git commit \"$@\" && git push; };f"


1

Nếu bạn đang sử dụng vỏ cá (xây dựng câu trả lời của btse):

Lưu tệp này trong '~ / .config / fish / Hàm' dưới dạng 'quickgit.fish'. Tạo thư mục nếu nó không tồn tại. '--git-dir = $ PWD / .git' Đảm bảo rằng chúng tôi chạy các lệnh git chống lại dự án git nơi chúng tôi gọi là hàm

function quickgit # This is the function name and command we call
    git --git-dir=$PWD/.git add . # Stage all unstaged files
    git --git-dir=$PWD/.git commit -a -m $argv # Commit files with the given argument as the commit message
    git --git-dir=$PWD/.git push # Push to remote
end

Khởi động lại thiết bị đầu cuối, điều hướng đến dự án, thực hiện thay đổi và bây giờ bạn có thể gọi 'quickgit "thông báo ví dụ"'. Thay đổi bây giờ sẽ được thêm, cam kết và đẩy :).

Cũng có thể được tìm thấy dưới dạng Gist tại đây: https://gist.github.com/Abushawish 43240a6087c212bd67ce1e93f8d283a69


1

Có rất nhiều giải pháp tốt, nhưng đây là một giải pháp mà tôi thấy thanh lịch hơn cho cách tôi muốn làm việc:

Tôi đặt một tập lệnh trong đường dẫn của mình có tên là "git-put" có chứa:

#!/bin/bash
git commit "$@" && git push -u

Điều đó cho phép tôi chạy:

git put -am "thông điệp cam kết của tôi"

.. để thêm tất cả các tệp, cam kết chúng và đẩy chúng.

(Tôi cũng đã thêm "-u" vì dù sao tôi cũng thích làm điều này, mặc dù nó không liên quan đến vấn đề này. Nó đảm bảo rằng nhánh ngược dòng luôn được thiết lập để kéo.)

Tôi thích cách tiếp cận này vì nó cũng cho phép sử dụng "git put" mà không cần thêm tất cả các tệp (bỏ qua "-a") hoặc với bất kỳ tùy chọn nào khác mà tôi có thể muốn vượt qua để cam kết. Ngoài ra, "đặt" là một mô tả ngắn của "đẩy" và "cam kết"


1

Nếu bạn sử dụng VSCode, bạn có thể tải này mở rộng sẽ cho phép bạn làm điều đó trong một phím tắt đơn giản.


1

Nếu bạn đang sử dụng máy Mac:

  1. Khởi động Loại thiết bị đầu cuối "cd ~ /" để đi đến thư mục nhà của bạn

  2. Nhập "touch .bash_profile" để tạo tệp mới của bạn.

  3. Chỉnh sửa .bash_profile bằng trình chỉnh sửa yêu thích của bạn (hoặc bạn chỉ có thể nhập "open -e .bash_profile" để mở nó trong TextEdit).

  4. Sao chép và dán bên dưới vào tập tin:

function lazygit() {
    git add .
    git commit -a -m "$1"
    git push
}

Sau này, khởi động lại thiết bị đầu cuối của bạn và chỉ cần thêm, cam kết và đẩy vào một lệnh dễ dàng, ví dụ:

lazygit "This is my commit message"

1

Đối với người dùng MAC VSC, thiết lập tốt nhất là:

1) nhấn 'shift + cmd + P' và gõ:

Shell Command: install 'code' command in PATH

Nhấn ENTER (thao tác này sẽ cài đặt lệnh mã để dễ dàng truy cập bash_profile)

2) bây giờ bạn có thể chạy: code ~/.bash_profileđể mở bash_profile trống

3) nhập một chức năng mới trong đó:

function lazygit() {
    git add .
    git commit -m "$*"
    git push
}

4) bây giờ khởi động lại VSC

5) thực hiện thay đổi, lưu nó và gõ lazygit messageđể chạy đồng thời ba lệnh


1

Đối với người dùng macOS:

  1. Mở Terminal hoặc iTerm2 hoặc thiết bị đầu cuối khác mà bạn sử dụng.

  2. Di chuyển đến thư mục hồ sơ người dùng của bạn với lệnh ~/. Đây là một thư mục mặc định cho .bash_profiletập tin:

Ví dụ thư mục người dùng

  1. Loại nano .bash_profileLệnh này sẽ mở .bash_profiletài liệu (hoặc tạo tài liệu nếu nó chưa tồn tại) trong trình soạn thảo văn bản dễ sử dụng nhất cho thiết bị đầu cuối - nano.

  2. Bây giờ bạn có thể thực hiện một thay đổi đơn giản cho tập tin. Dán các dòng mã này để thay đổi lời nhắc Terminal của bạn:

function lazygit() {
    git add .
    git commit -a -m "$1"
    git push
}

Chỉnh sửa văn bản Nano

  1. Bây giờ hãy lưu các thay đổi của bạn bằng cách nhập ctrl + ovà nhấn return để lưu. Sau đó thoát nanobằng cách gõ ctrl + x.

  2. Bây giờ chúng tôi cần kích hoạt các thay đổi của bạn. Nhập source .bash_profile(hoặc . ~/.bash_profile) và xem thay đổi nhanh chóng của bạn.

  3. Trong iTerm2 Preferences/Profiles/General/Commandđược đặt thành Login ShellSend text at startthành source ~/.bash_profile. Vì vậy, bạn không cần phải làm thủ công sau mỗi lần khởi động lại macOS. Ưu tiên iTerm 2

Thông tin xác thực: https://natelandau.com/my-mac-osx-bash_profile


0

Tôi đã thực hiện kịch bản .sh này cho lệnh

#!/bin/sh
cd LOCALDIRECTORYNAME/  
git config --global user.email "YOURMAILADDRESS"
git config --global user.name "YOURUSERNAME"
git init
git status
git add -A && git commit -m "MASSAGEFORCOMMITS"
git push origin master

0

Vì câu hỏi không chỉ định shell nào, đây là phiên bản eshell dựa trên các câu trả lời trước đó. Điều này có trong tệp bí danh eshell, có thể nằm trong ~ / .emacs.d / eshell / bí danh Tôi đã thêm phần đầu tiên z https://github.com/rupa/z/ để bạn nhanh chóng cd vào thư mục , để nó có thể được chạy bất kể thư mục hiện tại của bạn là gì.

alias census z cens; git add .; git commit -m "fast"; git push

0

Thêm vào ~/.bash_profileđể thêm, cam kết và đẩy với một lệnh đặt:

function g() { git commit -a -m "$*"; git push; }

Sử dụng:

g your commit message
g your commit message 'message'

Không cần trích dẫn mặc dù bạn không thể sử dụng dấu chấm phẩy hoặc dấu ngoặc đơn trong thông điệp cam kết của mình (cho phép trích dẫn đơn). Nếu bạn muốn bất kỳ trong số này chỉ cần đặt dấu ngoặc kép trong tin nhắn của bạn, ví dụ:

g "your commit message; (message)"

Để tạo một bình luận trong tin nhắn của bạn làm:

g "your commit message:
> your note"

Ngoài ra còn có một chức năng để thêm và cam kết theo cách tương tự:

function c() { git add --all; git commit -m "$*"; }

Hoạt động chính xác theo cùng một gchức năng và có cùng các ràng buộc. Chỉ cần đặt cthay thế. Ví dụ

c your commit message

Bạn cũng có thể thêm một bí danh để đẩy vào điều khiển từ xa:

alias p='git push'

Sử dụng:

p

Số tiền đó thành 2 chữ cái cpbạn sử dụng trong khi làm việc với kho git của mình. Hoặc bạn có thể sử dụng gthay vì làm tất cả chỉ với một chữ cái.

Danh sách đầy đủ các bí danh và chức năng: https://gist.github.com/matt360/0c5765d6f0579a5aa74641bc47ae50ac


0

Dựa trên lazygitcâu trả lời, giải pháp sau đây thêm kiểm tra người dùng để xác minh các thay đổi trước khi đẩy. Nó sẽ hoàn nguyên các lệnh nếu bị hủy. Và tất cả điều đó sẽ xảy ra nếu và chỉ khi có thay đổi trong repo cục bộ.

### SAFER LAZY GIT
function lazygit() {
  git add .
  if git commit -a -m "$1"; then
    read -r -p "Are you sure you want to push these changes? [y/N]} " response
    case "$response" in
      [yY][eE][sS]|[yY])
        git push
        ;;
      *)
        git reset HEAD~1 --soft
        echo "Reverted changes."
        ;;
    esac
  fi
}

0

Điều này là hoàn hảo cho nhóm lệnh.

Các lệnh nhóm

{ danh sách; } Đặt một danh sách các lệnh giữa các dấu ngoặc nhọn làm cho danh sách được thực thi trong bối cảnh shell hiện tại. Không có subshell được tạo ra. Danh sách dấu chấm phẩy (hoặc dòng mới) là bắt buộc.

legit(){ git add --all; git commit -m "$1"; git push origin master; }
legit 'your commit message here'

1
Điều này sẽ không hoạt động nếu thông điệp cam kết có khoảng trắng ở giữa
Rohit

0

Tôi thích chạy như sau:

git commit -am "message";git push

Tôi nghĩ rằng ;nên được thay thế bằng &&trong lệnh của bạn, vì sau này sẽ chỉ thực hiện git pushlệnh nếu không có lỗi trên (các) lệnh trước đó.
Tom

0

Tôi thấy bí danh này yolo thật tuyệt vời khi thậm chí gửi bình luận ngẫu nhiên cho cam kết trong khi tôi đang lười biếng. Nó hoạt động thực sự tốt ngoài hộp, vì vậy tôi chỉ cần làm git yolovà tất cả các thay đổi của tôi được đẩy tự động.

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.