Template:Article summary start Template:Article summary text Template:Article summary heading Template:Article summary wiki: Generally about contributing to pacman, although it still serves as a practical Git tutorial Template:Article summary wiki Template:Article summary wiki Template:Article summary wiki Template:Article summary wiki Template:Article summary link Template:Article summary end
有一个很全面的文档，包含了手册和教程，可以从 官方网站 获得。
Pacman 从 [extra] 仓库安装。如果你关心使用 Git 配合其他的 VCS 软件，邮件服务器，或者使用 Git 的图形界面，注意看可选的依赖。可以用
Bash 自动完成 (例如，按 tab 来完成你正在键入的命令)，只需要：
如果你想使用 Git 内建的图形界面 (例如
git gui) 你需要安装 软件包，否则你会遇到一个隐晦的错误信息：
/usr/bin/gitk: line 3: exec: wish: not found.
Git 从几个 INI 格式的配置文件中读取配置信息。在每一个 git 仓库中
.git/config 被用来指定与本仓库有关的配置选项。每一个用户 ("global") 的配置文件在
$HOME/.gitconfig 被用来作为仓库配置的备用配置。你也可以直接编辑文件，但是更推荐的方法是使用 git-config 工具。例如，
$ git config --global core.editor "nano -w"
editor = nano -w 到
git-config 工具的 man page 有一个很长的参数列表，列出所以可以设置的变量。
$ git config --global user.name "Firstname Lastname" $ git config --global user.email "email@example.com" $ git config --global color.ui true $ git config --global --list
git clone <repo location> <dir>
will clone a Git repository in a new directory inside your current directory. Leaving out
will cause it to name the folder after the Git repository. For example,
git clone firstname.lastname@example.org:torvalds/linux.git
clones Github's mirror of the Linux kernel into a directory named "linux".
Git's commit process involves two steps:
- Add new files, add changes for existing files (both with
git add <files>), and/or remove files (with
git rm). These changes are put in a staging area called the index.
git committo commit the changes.
Git commit will open up a text editor to provide a commit message.
You can set this editor to whatever you want by changing the
core.editor option with
Alternatively, you can use
git commit -m <message> to supply the commit message without opening the text editor.
Other useful commit tricks:
git commit -a lets you commit changes you have made to files already under Git control
without having to take the step of adding the changes to the index. You still have to add new files with git add.
git add -p lets you commit specific parts of files you have changed.
This is useful if you have made a bunch of changes that you think would be best split into several commits.
To push your changes up to a server (such as Github), use
git push <server name> <branch>
-u will make this server the default one to push to for this branch.
If you have cloned the repository as described above, the server will default to the location you cloned the
repository from (nicknamed "origin") and the branch will default to the master branch.
In other words, if you have followed this guide's instructions in cloning,
git push will suffice.
You can set up Git to push to multiple servers if you want, but that is a more advanced topic.
Branches will be discussed later in this guide.
If you are working on multiple machines and want to update your local repository to what the server has, you use
git pull <server name> <branch>
Similarly to push, the server name and branch should have sane defaults, so
git pull should suffice.
Git pull is actually shorthand for doing two things:
git fetch, which updates the local copy of what the server has. Such branches are called "remote" branches because they are mirroring remote servers.
git merge, which merges what the remote branch has with what you have. If your commit history is the same as the server's commit history, you will be automatically fast-forwarded to the latest commit on the server. If your history does not match (maybe someone else has pushed commits since you last synced), the two histories will be merged.
It is not a bad idea to get into the practice of using these two commands instead of
git pull. This way you can
check to make sure that the server contains what you would expect before merging.
git log shows the history of your current branch. Note that each commit is identified by a SHA-1 hash.
The author, commit date, and commit message follow. A more useful command is
git log --graph --oneline --decorate
which provides a display similar to TortoiseGit's log window. It shows the following:
- The first 7 digits of each commit's SHA-1 hash (enough to be unique)
--graphoption shows how any branches (if there are others) fork off from the current branch.
--onelineoption shows only the first line of each commit message
--decorateoption shows all commit labels (branches and tags)
It may be convenient to alias this command as
git graph by doing the following:
git config --global alias.graph 'log --graph --oneline --decorate'
git graph will run
git log --graph --oneline --decorate.
git graph and
git log may be given the
--all flag in order to view all branches instead of just the current one.
--stat to one of these commands is also useful -
it shows which files each commit changed and how many lines were changed in each file.
Merges happen when you pull, as a result of a rebase operation, and when you merge one branch into another.
Like other version control tools, when Git cannot automatically merge a commit, it turns to you.
See this section
of the Git Book for an explanation on how to resolve merge conflicts.
If you screw up and would like to back out of the merge, you can usually abort the merge using the
with whatever command started the merge (e.g.
git merge --abort,
git pull --abort,
git rebase --abort).
The above commands only provide the basics. The real power and convenience in Git (and other distributed version control systems) come from leveraging its local commits and fast branching. A typical Git workflow looks like this:
- Create and check out a branch to add a feature.
- Make as many commits as you would like on that branch while developing that feature.
- Squash, rearrange, and edit your commits until you are satisfied with the commits enough to push them to the central server and make them public.
- Merge your branch back into the main branch.
- Delete your branch, if you desire.
- Push your changes to the central server.
git branch <branch name>
can be used to create a branch that will branch off the current commit. After it has been created, you should switch to it using
git checkout <branch name>
A simpler method is to do both in one step with
git checkout -b <branch name>
To see a list of branches, and which branch is currently checked out, use
A word on commits
Many of the following commands take commits as arguments. A commit can be identified by any of the following:
- Its 40-digit SHA-1 hash (the first 7 digits are usually sufficient to identify it uniquely)
- Any commit label such as a branch or tag name
- The label
HEADalways refers to the currently checked-out commit (usually the head of the branch, unless you used
git checkoutto jump back in history to an old commit)
- Any of the above plus
~to refer to previous commits. For example,
HEAD~refers to one commit before
HEAD~5refers to five commits before
In Subversion and other older, centralized version control systems, commits are permanent - once you make them, they are there on the server for everyone to see. In Git, your commits are local and you can combine, rearrange, and edit them before pushing them to the server. This gives you more flexibility and lets you use commits as checkpoints. Commit early and commit often.
git commit --amend
allows you to modify the previous commit. The contents of the index will be applied to it, allowing you to add more files or changes you forgot to put in. You can also use it to edit the commit message, if you would like.
git rebase -i <commit>
will bring up a list of all commits between
<commit> and the present, including
HEAD but excluding
This command allows you rewrite history. To the left of each commit, a command is specified.
Your options are as follows:
- The "pick" command (the default) uses that commit in the rewritten history.
- The "reword" command lets you change a commit message without changing the commit's contents.
- The "edit" command will cause Git to pause during the history rewrite at this commit. You can then modify it with
git commit --amendor insert new commits.
- The "squash" command will cause a commit to be folded into the previous one. You will be prompted to enter a message for the combined commit.
- The "fixup" command works like squash, but discards the message of the commit being squashed instead of prompting for a new message.
- Commits can be erased from history by deleting them from the list of commits
- Commits can be re-ordered by re-ordering them in the list. When you are done modifying the list, Git will prompt you to resolve any resulting merge problems (after doing so, continue rebasing with
git rebase --continue)
When you are done modifying the list, Git will perform the desired actions.
If Git stops at a commit (due to merge conflicts caused by re-ordering the commits or due to the "edit" command),
git rebase --continue to resume. You can always back out of the rebase operation with
git rebase --abort.
The Git package comes with a prompt script. To enable the prompt addition you will need to source the git-prompt.sh script and add
$(__git_ps1 " (%s)") to you PS1 variable.
/usr/share/git/completion/git-prompt.shto your home directory (e.g.
- Add the following line to your .bashrc/.zshrc:
- For Bash:
PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
- For zsh:
PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ '
%s is replaced by the current branch name. The git information is displayed only if you are navigating in a git repository. You can enable extra information by setting and exporting certain variables to a non-empty value as shown in the following table:
|GIT_PS1_SHOWDIRTYSTATE||* for unstaged and + for staged changes|
|GIT_PS1_SHOWSTASHSTATE||$ if something is stashed|
|GIT_PS1_SHOWUNTRACKEDFILES||% if there are untracked files|
Since version 1.6.6 git is able to use the HTTP(S) protocol as efficiently as SSH or Git by utilizing the git-http-backend. Furthermore it is not only possible to clone or pull from repositories, but also to push into repositories over HTTP(S).
The setup for this is rather simple as all you need to have installed is the Apache web server (with mod_cgi, mod_alias, and mod_env enabled) and of course, git:
# pacman -S apache git
Once you have your basic setup up and running, add the following to your Apache's config usually located at
<Directory "/usr/lib/git-core*"> Order allow,deny Allow from all </Directory> SetEnv GIT_PROJECT_ROOT /srv/git SetEnv GIT_HTTP_EXPORT_ALL ScriptAlias /git/ /usr/lib/git-core/git-http-backend/
The above example config assumes that your git repositories are located at
/srv/git and that you want to access them via something like http(s)://your_address.tld/git/your_repo.git. Feel free to customize this to your needs.
For more detailed documentation, visit the following links:
You first need to have a public SSH key. For that follow the guide at Using SSH Keys. To set up SSH itself, you need to follow the SSH guide. This assumes you have a public SSH key now and that your SSH is working.
Open your SSH key in your favorite editor (default public key name is
~/.ssh/id_rsa.pub), and copy its content (Template:Keypress).
Now go to your user where you have made your Git repository, since we now need to allow that SSH key to log in on that user to access the Git repository.
~/.ssh/authorized_keys in your favorite editor, and paste the contents of id_rsa.pub in it. Be sure it is all on one line! That is important! It should look somewhat like this:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCboOH6AotCh4OcwJgsB4AtXzDo9Gzhl+BAHuEvnDRHNSYIURqGN4CrP+b5Bx/iLrRFOBv58TcZz1jyJ2PaGwT74kvVOe9JCCdgw4nSMBV44cy+6cTJiv6f1tw8pHRS2H6nHC9SCSAWkMX4rpiSQ0wkhjug+GtBWOXDaotIzrFwLw== username@hostname
Now you can checkout your Git repository this way (change where needed. Here it is using the git username and localhost):
git clone git@localhost:my_repository.git
You should now get an SSH yes/no question. Type
yes followed by Template:Keypress. Then you should have your repository checked out. Because this is with SSH, you also do have commit rights now. For that look at Git and Super Quick Git Guide.
Connecting on a port other than 22 can be configured on a per-host basis in
~/.ssh/config. To set up ports for a repository, specify the path in
.git/config using the port number
N and the absolute path
Typically the repository resides in the home directory of the user which allows you to use tilde-expansion. Thus to connect on port N=443,
url = email@example.com:repo.git
This will allow URLs like "git clone git://localhost/my_repository.git".
Edit the configuration file for git-daemon
/etc/conf.d/git-daemon.conf (GIT_REPO is a place with your git projects), then start git-daemon with root privileges:
# systemctl start git-daemon@
To run the git-daemon every time at boot, enable the service:
# systemctl enable git-daemon@
Clients can now simply use:
git clone git://localhost/my_repository.git
To restrict read/write access, you can simply use Unix rights, see http://sitaramc.github.com/gitolite/doc/overkill.html