- Git Version Control Cookbook
- Aske Olsson Rasmus Voss
- 1007字
- 2021-12-08 12:33:50
Git aliases
An alias is a nice way to configure long and/or complicated Git commands to represent short useful ones. An alias is simply a configuration entry under the alias section. It is usually configured to --global
to apply it everywhere.
Getting ready
In this example, we will use the jgit
repository, which was also used in Chapter 1, Navigating Git, with the master
branch pointing at b14a93971837610156e815ae2eee3baaa5b7a44b
. Either use the clone from Chapter 1, Navigating Git, or clone the repository again, as follows:
$ git clone https://git.eclipse.org/r/jgit/jgit $ cd jgit $ git checkout master && git reset --hard b14a939
How to do it...
First, we'll create a few simple aliases, then a couple of more special ones, and finally a couple of aliases using external commands. Instead of writing git checkout
every time we need to switch branches, we can create an alias of that command and call it git co
. We can do the same for git branch
, git commit
, and git status
as follows:
$ git config --global alias.co checkout $ git config --global alias.br branch $ git config --global alias.ci commit $ git config --global alias.st status
Now, try to run git st
in the jgit
repository as follows:
$ git st # On branch master nothing to commit, working directory clean
The alias method is also good to create the Git commands you think are missing in Git. One of the common Git aliases is unstage
, which is used to move a file out of the staging area, as shown in the following command:
$ git config --global alias.unstage 'reset HEAD --'
Try to edit the README.md
file in the root of the jgit
repository and add it in the root. Now, git status/git st
should display something like the following:
$ git st # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: README.md #
Let's try to unstage README.md
and then look at git st
as follows:
$ git unstage README.md Unstaged changes after reset: M README.md $ git st # On branch master # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: README.md # no changes added to commit (use "git add" and/or "git commit -a")
A common use case for aliases is to format the history of Git in specific ways. Let's say you want the number of lines added and deleted for each file in the commit displayed along with some common commit data. For this, we can create the following alias so we don't have to type everything each time:
$ git config --global alias.ll "log --pretty=format:\"%C(yellow)%h%Cred%d %Creset%s %Cgreen(%cr) %C(bold blue)<%an>%Creset\" --numstat"
Now, we can execute git ll
in the terminal and get a nice stat output, as shown in the following command:
$ git ll b14a939 (HEAD, master) Prepare 3.3.0-SNAPSHOT builds (8 days ago) <Matthias Sohn> 6 6 org.eclipse.jgit.ant.test/META-INF/MANIFEST.MF 1 1 org.eclipse.jgit.ant.test/pom.xml 3 3 org.eclipse.jgit.ant/META-INF/MANIFEST.MF 1 1 org.eclipse.jgit.ant/pom.xml 4 4 org.eclipse.jgit.archive/META-INF/MANIFEST.MF 2 2 org.eclipse.jgit.archive/META-INF/SOURCE-MANIFEST.MF 1 1 org.eclipse.jgit.archive/pom.xml 6 6 org.eclipse.jgit.console/META-INF/MANIFEST.MF 1 1 org.eclipse.jgit.console/pom.xml 12 12 org.eclipse.jgit.http.server/META-INF/MANIFEST.MF ...
It is also possible to use an external command instead of a Git command. So, small shell scripts and so on can be embedded. To create an alias with an external command, the alias must start with an exclamation mark !
. The examples can be used when resolving conflicts from a rebase or merge. In your ~/.gitconfig
file under [alias], add the following:
editconflicted = "!f() {git ls-files --unmerged | cut -f2 | sort -u ; }; $EDITOR 'f'"
This will bring up your configured $EDITOR
with all the files that are in the conflict state due to the merge/rebase. This quickly allows you to fix the conflicts and get on with the merge/rebase.
In the jgit
repository, we can create two branches at an earlier point in time and merge these two branches:
$ git branch A 03f78fc $ git branch B 9891497 $ git checkout A Switched to branch 'A' $ git merge B
Now, you'll see that this fails to perform the merge, and you can run git st
to check the status ses of a lot of files that are in a conflicted state, both modified
. To open and edit all the conflicted files, we can now run git editconflicted
. This brings up $EDITOR
with the files. If your environment variable isn't set, use EDITOR=<you-favorite-editor>
export to set it.
For this example, we don't actually resolve the conflicts. Just check that the alias works and you're ready for the next alias.
Now that we have solved all the merge conflicts, it is time to add all of those files before we conclude the merge. Luckily, we can create an alias that can help us with that, as follows:
addconflicted = "!f() { git ls-files --unmerged | cut -f2 | sort -u ; }; git add 'f'"
Now, we can run git addconflicted
. Later, git status
will tell us that all the conflicted files are added:
$ git st On branch A All conflicts fixed but you are still merging. (use "git commit" to conclude merge) Changes to be committed: modified: org.eclipse.jgit.console/META-INF/MANIFEST.MF modified: org.eclipse.jgit.console/pom.xml modified: org.eclipse.jgit.http.server/META-INF/MANIFEST.MF modified: org.eclipse.jgit.http.server/pom.xml modified: org.eclipse.jgit.http.test/META-INF/MANIFEST.MF modified: org.eclipse.jgit.http.test/pom.xml ...
Now we can conclude the merge with git commit
:
$ git commit [A 94344ae] Merge branch 'B' into A
How it works...
Git simply runs the command the alias is short for. It is very convenient for long Git commands, or Git commands that are hard to remember exactly how to write. Now, all you have to remember is the alias and you can always look in the configuration file for it.
There's more...
Another way to create a kind of Git alias is to make a shell script and save the file with the name git-<your-alias-name>
. Make the file executable and place it somewhere in your $PATH
. You can now run that file simply by running git
<your-alias-name>
from the command line.
- ExtGWT Rich Internet Application Cookbook
- AngularJS Testing Cookbook
- Java 開發從入門到精通(第2版)
- Arduino by Example
- 控糖控脂健康餐
- Web Development with Django Cookbook
- MySQL數據庫基礎實例教程(微課版)
- The Complete Coding Interview Guide in Java
- Java程序設計入門
- Spring Boot+MVC實戰指南
- Laravel Application Development Blueprints
- Learning Ionic
- Practical GIS
- Hacking Android
- SQL Server on Linux