git Befehle hinzufügen, festschreiben und pushen in einem?


220

Gibt es eine Möglichkeit, diese drei Befehle in einem zu verwenden?

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

Manchmal ändere ich nur einen Buchstaben, CSS-Padding oder so. Trotzdem muss ich alle drei Befehle schreiben, um die Änderungen zu übernehmen. Es gibt viele Projekte, bei denen ich nur ein Drücker bin, also wäre dieser Befehl fantastisch!


10
Haben Sie versucht, ein Shell-Skript zu schreiben?
Paul


Es gibt viele Änderungen in meinem Code, wenn Sie nur einen Abstand in CSS oder einen Buchstaben usw. ändern. Das Festschreiben von Nachrichten und all diesen Befehlen fügt viel Arbeit hinzu. Kein Shell-Skript ausprobiert. Wie geht das? Vielen Dank!
Gediminas

2
"(brauche auch keine Commit-Nachricht)" images.wikia.com/dragonball/images/a/a7/Facepalm_227785.jpg
Ajedi32

2
Wenn Sie für jede einzelne Instanz einer Änderung ein Commit durchführen, machen Sie es falsch. tun Sie den Befehl ist , wenn Sie Funktion ist fertig oder Fehler behoben ist (dies könnte eine einzige Änderung sein)
Mark

Antworten:


234

Aufbauend auf @ Gavins Antwort:

Wenn Sie Lazygit zu einer Funktion anstelle eines Alias ​​machen, können Sie ihm ein Argument übergeben. Ich habe meinem .bashrc (oder .bash_profile wenn Mac) Folgendes hinzugefügt:

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

Auf diese Weise können Sie eine Festschreibungsnachricht bereitstellen, z

lazygit "My commit msg"

Sie könnten dies natürlich noch weiter verbessern, indem Sie noch mehr Argumente akzeptieren, z. B. an welchen entfernten Ort oder an welchen Zweig.


10
Neustart nicht erforderlich, machen Sie einfach "source .bashrc"
Sambit Tripathy

25
könnte verwenden, $*anstatt $1die Eingabe der Anführungszeichen zu speichern:lazygit My commit msg
Kai Carver

16
@ KaiCarver Netter Gedanke, aber ich persönlich mag es nicht. Es verhindert, dass Sie mehrere Argumente verwenden, und widerspricht auch der normalen Konvention eines einzelnen Zeichenfolgenarguments, bei dem Leerzeichen in Anführungszeichen gesetzt werden. Dies ist für mich an dieser Stelle eine zweite Natur (und ich würde viele Entwickler annehmen). Das Auslassen der Zitate fühlt sich schmutzig an.
Btse

6
Lazygit, bester Name aller Zeiten!
user1447414

4
@btse ich bin eine diplomatische Person + es ist Freitag. Hier ist die Funktion mit @ KaiCarver Vorschlag: function dirtygit() { git add . git commit -a -m "$*" git push }
OnklMaps

84

Am Ende habe ich meiner .gitconfigDatei einen Alias ​​hinzugefügt :

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

Verwendung: git cmp "Long commit message goes here"

Fügt alle Dateien hinzu, verwendet dann den Kommentar für die Festschreibungsnachricht und verschiebt ihn auf den Ursprung.

Ich denke, es ist eine bessere Lösung, weil Sie die Kontrolle über die Commit-Nachricht haben.

Der Alias ​​kann auch über die Befehlszeile definiert werden. Dies fügt ihn Ihrem hinzu .gitconfig:

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

6
Genau das habe ich gesucht! Funktioniert perfekt, danke! Ich konnte keine vollständige Syntaxreferenz oder eine detaillierte Liste von Befehlen finden. Was macht !f() { ... }; fgenau? Mehr Erklärung dieser Zeile würde die Antwort noch besser machen.
Dmitriy Gamolin

1
@DmitriyDemir Definiert die Funktion fund ruft sie dann auf.
Oliver

Funktioniert sehr gut. Ich habe git pullzum Start hinzugefügt , damit Zusammenführungen reduziert werden.
Burhan

1
@Oliver Warum steht es in Anführungszeichen? Warum gibt es ein Ausrufezeichen? Ruft das f am Ende die Funktion auf? Was ist "$ @"?
Philip Rego

@PhilipRego Falsch Oliver: p
Oliver

53

Obwohl ich Wayne Werner in seinen Zweifeln zustimme, ist dies technisch eine Option:

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

Welches definiert einen Alias, der ausgeführt wird commitund push. Verwenden Sie es als git acp. Bitte beachten Sie, dass solche "Shell" -Aliasnamen immer im Stammverzeichnis Ihres Git-Repositorys ausgeführt werden.

Eine andere Option könnte darin bestehen, einen Post-Commit-Hook zu schreiben, der den Push ausführt.

Übrigens können Sie tatsächlich Argumente an Shell-Aliase übergeben. Wenn Sie eine benutzerdefinierte Festschreibungsnachricht übergeben möchten, verwenden Sie stattdessen:

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

(Natürlich, jetzt, müssen Sie eine Nachricht verpflichten geben: git acp "My message goes here!")


@wlz Ich habe es gerade versucht und es funktioniert gut. Beachten Sie, dass sich die gesamte Zeichenfolge in einfachen Anführungszeichen befindet. gitfügte automatisch die Escapezeichen hinzu (markiert mit git config -e).
Tilman Vogel

Entschuldigung, du hast recht :). Ich bearbeite direkt die .gitconfig-Datei. Das "ist bereits mit \ entkommen".
wlz

2
Warum ist das nicht die akzeptierte Antwort? Es macht was gefragt wurde. +1.
lucid_dreamer

1
Unter Windows musste ich mich den doppelten Anführungszeichen um 1 US-Dollar entziehen, damit es in PowerShell funktioniert (mit ... \ "$ 1 \" ...)
DReimer

35

Ich denke, Sie könnten den Workflow, für den git entwickelt wurde, falsch verstehen. (Um zu verdeutlichen / zu korrigieren, was ich in dem Kommentar gemeint habe, benötigen Sie das nicht git add ., da es commit -anormalerweise dem gleichen Zweck dient - Hinzufügen von Änderungen, die noch nicht bereitgestellt wurden, wenn die Dateien bereits hinzugefügt wurden)

Normalerweise machen Sie so etwas:

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

Waschen, Spülen, Wiederholen, bis Sie Feature X beendet haben oder an einem Haltepunkt sind oder nur andere Personen sehen sollen, was Sie getan haben. Dann tust du es

$ git push

Git ist kein SVN - aber es scheint, dass Sie versuchen, es als solches zu verwenden. Möglicherweise finden Sie einige der Ressourcen am Ende des Artikels hier von Nutzen.


6
+1 für die Erläuterung des Workflows. Jedoch git add .und git commit -a sind nicht dasselbe
Gabriele Petronella

5
Vielen Dank für die Erklärung, aber GIT wird nicht zusammenbrechen, wenn es einen solchen Befehl für diejenigen gibt, die wissen, was sie tun ...
Gediminas

4
@Lucas: Erfahrene Programmierer werden Ihnen sagen, dass Leute, die nach einem automatischen Commit-Push-Befehl fragen, nicht wissen, was sie tun. Es gibt einen Grund für das dreistufige Einchecken von Code (wenn Sie Feature-Zweige verwenden, vierstufig).
Slebetman

1
@slebetman: Ich habe es nicht richtig erklärt. Bei Facebook-Apps muss jede einzelne Änderung auch für die Entwicklung auf dem Live-Server bereitgestellt werden. Dazu haben wir Commit-Hooks eingerichtet. Sie nehmen eine Änderung vor, übernehmen sie und sehen die Änderung in Ihrer App. Mit git muss ich hinzufügen, inszenieren und dann drücken, um eine einzelne Änderung zu sehen. Sieht es nicht übertrieben aus?
SenG

1
Ja, aber Sie müssen sich auch nicht verpflichten, Ihren Code zu testen. Sie sollten Code schreiben, testen und dann festschreiben und pushen. Die legendäre Verwendung lokaler Git-Commits, um eine Art "Rückgängig" -Funktionalität für mehrere Dateien bereitzustellen, wird meiner Erfahrung nach in der Legende weitaus häufiger verwendet als in der Realität.
Joe Strout

35

Ich benutze dies in meinem .bash_profile

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

Es wird wie ausgeführt

gp A really long commit message

Vergessen Sie nicht, source ~/.bash_profilenach dem Speichern des Alias auszuführen .


1
Ich mag das sehr. ... und habe es deshalb in mein eigenes ~ / .bash_profile übernommen;) danke .. +1
AO_

28

Sie können das Bash-Skript verwenden und einen Alias ​​festlegen, um einen Befehl oder eine Gruppe von Befehlen zu starten

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

2
Wenn Sie dies zu einer Antwort machen möchten, fügen Sie bitte weitere Kommentare zur Funktionsweise hinzu. Antworten, bei denen es sich lediglich um einen Code-Dump handelt, werden im Allgemeinen nicht gut aufgenommen. Siehe Antworten .
Heretic Monkey

Ich denke, das sollte die richtige Antwort sein. Da beantwortet es die Frage so prägnant wie möglich. Geben Sie es einfach in das Terminal ein und es funktioniert! Wenn Sie keinen Alias ​​hinzufügen möchten, können Sie alternativ einfach eine textExpander-Erweiterung erstellen und diese über eine Tastenkombination auslösen.
Eonist

19

In Bash als Alias ​​festlegen:

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

Nennen:

$ lazygit

(Um diesen Alias ​​dauerhaft zu machen, müssen Sie ihn in Ihr .bashrc- oder .bash_profile aufnehmen.)


Sie müssten diesen Alias ​​zu .bashrc oder .bash_profile hinzufügen, um ihn dauerhaft zu machen
Gavin

Ich denke, diese Seite kann helfen zu erklären: serverfault.com/questions/3743/…
Gavin

17

Die einfachste Lösung wäre:

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

git add ist bereits in -a Parameter von commit enthalten, aber wenn Sie möchten, können Sie alle verbinden:

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

10

Unter Linux / Mac sollte diese sehr praktische Option auch funktionieren

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

Wenn Sie an einem neuen Zweig arbeiten, der lokal erstellt wurde, ändern Sie diegit push Stück mitgit push -u origin branch_name

Wenn Sie Ihre Commit-Nachricht im Systemeditor bearbeiten möchten, dann

git commit -a && git push 

öffnet den Editor und sobald Sie die Nachricht gespeichert haben, wird sie auch gepusht.


8

Sie können versuchen, gitu .

Zum ersten Mal (Knoten js muss installiert sein):

npm install -g git-upload

Nachdem:

gitu COMMIT_MSG

Diese drei Befehle gleichzeitig ausgeben.

Das Gute ist, dass Sie sich keine Sorgen machen müssen, wenn Sie Ihr System neu installieren oder wenn Sie dies auf verschiedenen Computern tun möchten und keine Dateimodifikation erforderlich ist. Dies funktioniert auch auf verschiedenen Plattformen (nicht nur Linux und Mac, sondern auch Windows unter Eingabeaufforderung wie cmdund powershell), nur dass Sie installieren müssen npmund nodejs( gitnatürlich).


6

Wenn die Datei bereits verfolgt wird, müssen Sie sie nicht ausführen git add , sondern können einfach schreibengit commit -am 'your message'

Wenn Sie keine Commit-Nachricht schreiben möchten, können Sie Folgendes tun

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



3

Wie in dieser Antwort erwähnt, können Sie einen Git-Alias erstellen und ihm eine Reihe von Befehlen zuweisen. In diesem Fall wäre es:

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

und benutze es mit

git add-com-push

1
Dies fügt keiner der vorherigen Antworten etwas hinzu.
BanksySan

Es tut mir leid, du hast recht. Ich glaube, ich habe nicht bemerkt, dass Tilman Vogels Antwort dieselbe war wie meine. Soll ich sie löschen?
Cristianzamar

3

Schreiben Sie ein kleines Skript namens gitpush.sh mit den folgenden Zeilen und fügen Sie es Ihrem ~ Verzeichnis hinzu.

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

Fügen Sie nun einen Alias ​​in ~ / .bashrc wie folgt hinzu:

alias gitpush='~/gitpush'

Schreiben Sie jetzt aus jedem Git-Repository einfach die "Nachricht" von gitpush.


2

Ich benutze eine Batch-Datei:

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

Probs wären einfacher, wenn Sie Argumente über die Befehlszeile akzeptieren würden. Ich gehe einfach "lezygit MESSAGE" usw. Es ist ziemlich cool!
John Hon

1

Es gibt einige Probleme mit den obigen Skripten:

shift "entfernt" den Parameter $ 1, andernfalls liest "push" ihn und "missversteht ihn".

Mein Tipp:

git config --global alias.acpp '! git add -A && branchatu = "$ (git symbolisch-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

Wenn Sie ein svn-ähnliches Verhalten von git commit wünschen, verwenden Sie dieses in Ihren git-Aliasnamen in Ihrer .gitconfig

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


1

Wenn Sie Fischschalen verwenden (basierend auf der Antwort von btse):

Speichern Sie diese Datei in '~ / .config / fish / functions' als 'quickgit.fish'. Erstellen Sie das Verzeichnis, falls es nicht vorhanden ist. '--git-dir = $ PWD / .git' Stellt sicher, dass wir die git-Befehle für das git-Projekt ausführen, in dem wir die Funktion aufgerufen haben

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

Starten Sie das Terminal neu, navigieren Sie zum Projekt, nehmen Sie Änderungen vor, und jetzt können Sie 'quickgit "Beispielnachricht" aufrufen. Änderungen werden jetzt hinzugefügt, festgeschrieben und gepusht :).

Auch als Gist finden Sie hier: https://gist.github.com/Abushawish/3440a6087c212bd67ce1e93f8d283a69


1

Es gibt bereits viele gute Lösungen, aber hier ist eine Lösung, die ich für die Art und Weise, wie ich arbeiten möchte, eleganter finde:

Ich habe ein Skript in meinen Pfad eingefügt, das "git-put" heißt und Folgendes enthält:

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

Das erlaubt mir zu rennen:

git put -am "meine Festschreibungsnachricht"

..um alle Dateien hinzuzufügen, festzuschreiben und zu pushen.

(Ich habe auch das "-u" hinzugefügt, weil ich dies sowieso gerne mache, obwohl es nicht mit diesem Problem zusammenhängt. Es stellt sicher, dass der Upstream-Zweig immer zum Ziehen eingerichtet ist.)

Ich mag diesen Ansatz, weil er auch die Verwendung von "git put" ermöglicht, ohne alle Dateien hinzuzufügen (überspringen Sie "-a"), oder mit anderen Optionen, die ich möglicherweise zum Festschreiben übergeben möchte. Außerdem ist "put" ein kurzes Portmanteau aus "push" und "commit".


1

Wenn Sie VSCode verwenden, können Sie diese Erweiterung herunterladen , mit der Sie dies in einer einfachen Tastenkombination tun können.


1

Wenn Sie einen Mac verwenden:

  1. Starten Sie den Terminaltyp "cd ~ /", um zu Ihrem Home-Ordner zu gelangen

  2. Geben Sie "touch .bash_profile" ein, um Ihre neue Datei zu erstellen.

  3. Bearbeiten Sie .bash_profile mit Ihrem bevorzugten Editor (oder geben Sie einfach "open -e .bash_profile" ein, um es in TextEdit zu öffnen).

  4. Kopieren Sie das Folgende und fügen Sie es in die Datei ein:

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

Starten Sie danach Ihr Terminal neu und fügen Sie einfach einen einfachen Befehl hinzu, schreiben Sie ihn fest und drücken Sie ihn. Beispiel:

lazygit "This is my commit message"

1

Für MAC VSC-Benutzer ist das beste Setup:

1) Drücken Sie 'Shift + cmd + P' und geben Sie Folgendes ein:

Shell Command: install 'code' command in PATH

Drücken Sie die EINGABETASTE (dadurch wird der Codebefehl installiert, um einfach zum bash_profile zu gelangen.)

2) Sie können jetzt ausführen: code ~/.bash_profileum das leere bash_profile zu öffnen

3) Geben Sie dort eine neue Funktion ein:

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

4) Starten Sie jetzt VSC neu

5) Nehmen Sie eine Änderung vor, speichern Sie sie und geben Sie ein, um lazygit messagedie drei Befehle gleichzeitig auszuführen


1

Für die MacOS-Benutzer:

  1. Öffnen Sie Ihr Terminal oder iTerm2 oder ein anderes Terminal, das Sie verwenden.

  2. Wechseln Sie mit dem Befehl in Ihren Benutzerprofilordner ~/. Es ist ein Standardordner für .bash_profileDateien:

Beispiel für einen Benutzerordner

  1. Typ nano .bash_profileDieser Befehl öffnet das .bash_profileDokument (oder erstellt es, falls es noch nicht vorhanden ist) im einfachsten Texteditor für Terminal - nano.

  2. Jetzt können Sie die Datei einfach ändern. Fügen Sie diese Codezeilen ein, um Ihre Terminal-Eingabeaufforderung zu ändern:

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

Nano-Textbearbeitung

  1. Speichern Sie nun Ihre Änderungen, indem Sie eingeben ctrl + ound zum Speichern die Eingabetaste drücken. Beenden Sie dann nanodurch Eingabe ctrl + x.

  2. Jetzt müssen wir Ihre Änderungen aktivieren. Geben Sie source .bash_profile(oder . ~/.bash_profile) ein und beobachten Sie, wie sich Ihre Eingabeaufforderung ändert.

  3. In iTerm2 Preferences/Profiles/General/Commandauf Login Shellund Send text at startauf setzen source ~/.bash_profile. Sie müssen es also nicht nach jedem Neustart von macOS manuell erstellen. iTerm 2 Einstellungen

Anmeldeinformationen: https://natelandau.com/my-mac-osx-bash_profile


0

Ich habe dieses .sh-Skript für den Befehl ausgeführt

#!/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

Da die Frage nicht angibt, welche Shell verwendet wird, ist hier die Eshell-Version, die auf den früheren Antworten basiert. Dies geht in die eshell-Alias-Datei, die sich möglicherweise in ~ / .emacs.d / eshell / alias befindet. Ich habe den ersten Teil z https://github.com/rupa/z/ hinzugefügt , mit dem Sie schnell in ein Verzeichnis cd , damit dies unabhängig von Ihrem aktuellen Verzeichnis ausgeführt werden kann.

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

0

Add-In ~/.bash_profilezum Hinzufügen, Festschreiben und Drücken mit einem Befehl:

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

Verwendung:

g your commit message
g your commit message 'message'

Es sind keine Anführungszeichen erforderlich, obwohl Sie in Ihren Festschreibungsnachrichten keine Semikolons oder Klammern verwenden können (einfache Anführungszeichen sind zulässig). Wenn Sie eines dieser Elemente möchten, setzen Sie einfach doppelte Anführungszeichen in Ihre Nachricht, z.

g "your commit message; (message)"

So erstellen Sie einen Kommentar in Ihrer Nachricht:

g "your commit message:
> your note"

Es gibt auch eine Funktion zum Hinzufügen und Festschreiben auf ähnliche Weise:

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

gFunktioniert genauso wie diese Funktion und unterliegt denselben Einschränkungen. Einfach cstattdessen setzen . Z.B

c your commit message

Sie können auch einen Alias ​​für das Pushing auf die Fernbedienung hinzufügen:

alias p='git push'

Verwendung:

p

Dass Beträge in 2 Buchstaben, cund pSie verwenden , während mit Ihrem Git Repository arbeiten. Oder Sie können gstattdessen alles mit nur einem Buchstaben ausführen.

Vollständige Liste der Aliase und Funktionen: https://gist.github.com/matt360/0c5765d6f0579a5aa74641bc47ae50ac


0

Aufbauend auf der lazygitAntwort fügt die folgende Lösung eine Benutzerprüfung hinzu, um die Änderungen vor dem Push zu überprüfen. Die Befehle werden zurückgesetzt, wenn sie abgebrochen werden. Und das alles passiert nur dann, wenn sich das lokale Repo ändert.

### 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

Dies ist perfekt für die Befehlsgruppierung.

Gruppierungsbefehle

{ aufführen; } Durch das Platzieren einer Liste von Befehlen zwischen geschweiften Klammern wird die Liste im aktuellen Shell-Kontext ausgeführt. Es wird keine Unterschale erstellt. Die folgende Liste mit Semikolon (oder Zeilenumbruch) ist erforderlich.

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

1
Dies wird nicht funktionieren, wenn Commit-Nachricht Leerzeichen dazwischen hat
Rohit

0

Ich möchte Folgendes ausführen:

git commit -am "message";git push

Ich denke, das ;sollte &&in Ihrem Befehl durch ersetzt werden, da der spätere git pushBefehl nur ausgeführt wird, wenn bei den vorherigen Befehlen kein Fehler vorliegt.
Tom

0

Ich fand diesen yolo Alias ​​erstaunlich, sogar einen zufälligen Kommentar zum Commit einzureichen, während ich faul bin. Es funktioniert sofort sehr gut, also mache ich es einfach git yolound alle meine Änderungen werden automatisch übertragen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.