1. 配置
git config -l
: 查看所有配置信息;git config --global user.name "USERNAME"
: 设置用户名为USERNAME
;git config --global user.email example@example.com
: 设置用户邮箱为example@example.com
在特定项目中使用其他配置时,去掉 --global
,重新设置。
2. 取得项目的 Git 仓库
git init
: 在工作目录中初始化新仓库;git clone [url]
: 从现有仓库克隆;git clone [url] PROJECT-NAME
:从现有仓库克隆,并指定项目名称。
3. 记录每次更新到仓库
git status
: 检查当前文件状态;git add
: 可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等;- 文件
.gitignore
: 忽略某些文件。- 所有空行或者以注释符号 # 开头的行都会被 Git 忽略。
- 可以使用标准的 glob 模式匹配。
- 匹配模式最后跟反斜杠(/)说明要忽略的是目录。
- 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
git diff
: 查看尚未暂存的文件更新了哪些部分;git diff --cached
: 看已经暂存起来的文件和上次提交时的快照之间的差异;git diff --staged
: 同5,Git 1.6.1 及更高版本可使用;git commit
: 提交更新;git rm FILE-NAME
: 从暂存区移除,并删除制定文件;git rm --cached FILE-NAME
: 从暂存区移除指定文件,文件会被保留;git mv file_from file_to
: 文件改名;git log
: 查看提交历史;git log -p -2
: 显示最近两次更新,并展开显示提交的内容差异。
4. 分支
4.1 显示分支
git branch
: 显示分支;git branch -v
: 显示分支,包含最后一次提交信息;git branch --merged
: 显示已经合并的分支;git branch --no-merged
: 显示未合并的分支。
4.2 新建分支
git checkout -b iss53
: 新建分支iss53
并切换到此分支上,它是下面两条命令的简写:git branch iss53
: 新建分支iss53
;git checkout iss53
: 切换到分支iss53
。
4.3 切换分支
git checkout iss53
: 切换到分支iss53
。
4.4 合并分支
把 hotfix
分支合并至 master
分支:
git checkout master
: 切换到master
分支;git merge hotfix
: 合并;git branch -d hotfix
: 删除hotfix
分支。
4.5 撤销合并
修复引用
git reset --hard HEAD~
: 在 get merge
之后使用此命令,被合并的两个分支的指针会回到合并前的状态。
对于只存在于本地仓库中的合并来说,使用这个命令会很方便。但是它会重写历史,在一个共享仓库中会造成问题。
还原提交
git revert -m 1 HEAD
: topic
分支合并至 master
分支后,使用此命令会生成一个新提交,该提交会撤销前一个合并产生的修改。
注:
-m 1
标记指出mainline
需要被保留下来的父结点。1
号节点为合并前master
分支所在节点;2
号节点则为topic
。- 还原提交后,再使用
git merge topic
,时会提示Already up-to-date.
,因为此时topic
分支为master
分支的父节点。
如果想把topic
分支上的内容再合并到master
,应使用git revert [commit]
还原上一次还原。其中[commit]
为还原提交的SHA1 ID
。
4.6 删除分支
git branch -d hotfix
: 删除hotfix
分支(用于删除已被 merged 的分支);git branch -D hotfix
: 强制删除hotfix
分支。
5. 远程仓库
git remote
: 列出所有远程主机;git remote -v
: 列出所有远程主机及其网址;git remote add <主机名> <网址>
: 添加远程主机,如git remote add origin git@github.com:nxjniexiao/test.git
5.1 git fetch
git fetch
命令用于从服务器上抓取本地没有的数据时,它并不会修改工作目录中的内容。 它只会获取数据然后让你自己合并。
如果要同步你的工作,运行 git fetch origin
命令。 这个命令查找 "origin"
是哪一个服务器(在本例中,它是 git.ourcompany.com),从中抓取本地没有的数据,并且更新本地数据库,移动 origin/master
指针指向新的、更新后的位置。
get fetch --all
: 抓取所有远程仓库。
5.2 git pull
git pull
在大多数情况下它的含义是一个 git fetch
紧接着一个 git merge
命令。 如果有一个像之前章节中演示的设置好的跟踪分支,不管它是显式地设置还是通过 clone
或 checkout
命令为你创建的,git pull
都会查找当前分支所跟踪的服务器与分支,从服务器上抓取数据然后尝试合并入那个远程分支。
git pull <远程主机名> <远程分支名>:<本地分支名>
: 取回远程主机某个分支的更新,再与本地的指定分支合并。
git pull origin next:master
表示:取回origin主机的next分支,与本地的master分支合并。
5.3 跟踪分支
命令: git checkout -b [branch] [remotename]/[branch]
从一个远程跟踪分支检出一个本地分支会自动创建所谓的跟踪分支。跟踪分支是与远程分支有直接关系的本地分支。 如果在一个跟踪分支上输入 git pull
,Git 能自动地识别去哪个服务器上抓取、合并到哪个分支。
当克隆一个仓库时,它通常会自动地创建一个跟踪 origin/master
的 master
分支。
如 git checkout -b serverfix origin/serverfix
会创建一个本地分支 serverfix
,并且起点位于 origin/serverfix
。本地分支和远程分支同名时,可以使用如下命令:
1
git checkout --track origin/serverfix
注: 使用 git checkout serverfix
时,如果本地没有此分支,且远程仓库里有,我们会得到和上述两个命令相同的结果。
git branch -u origin/serverfix
: 添加、修改跟踪分支,-u origin/serverfix
是 --set-upstream-to=origin/serverfix
的简写。
git branch -vv
: 查看设置的所有跟踪分支。
5.4 推送到远程仓库
git push [remote-name] [branch-name]
: 当你想要将 master
分支推送到 origin
服务器时(再次说明,克隆时通常会自动帮你设置好那两个名字),那么运行这个命令就可以将你所做的备份到服务器:
1
$ git push origin master
git push origin --delete serverfix
: 删除远程仓库 origin
的 serverfix
分支。
6. 变基
在 Git 中整合来自不同分支的修改主要有两种方法:merge
以及 rebase
。
6.1 常规用法
1
2
3
A---B---C topic
/
D---E---F---G master
使用 git merge master topic
合并后:
1
2
3
A---B---C topic
/ \
D---E---F---G---H master
使用 git rebase master topic
(git checkout topic
+ git rebase master
)变基后:
1
2
3
A'--B'--C' topic
/
D---E---F---G master
6.2 –onto 选项
1
2
3
4
5
o---o---o---o---o master
\
D---E---F---G---H next
\
A---B---C topic
假设你希望将 topic
中的修改合并到主分支并发布,但暂时并不想合并 next
中的修改,因为它们还需要经过更全面的测试。
这时,你就可以使用 git rebase
命令的 --onto
选项,选中在 topic
分支里但不在 next
分支里的修改(即 D-H ),将它们在 master
分支上重放(git rebase --onto master next topic
):
1
2
3
4
5
o---o---o---o---o master
| \
| A'--B'--C' topic
\
D---E---F---G---H next
7. 撤销
7.1 重新提交
比如 commit
后发现漏掉了一个文件,则可以进行如下操作:
1
2
3
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend
第二次提交将代替第一次提交的结果。
8.2 取消暂存文件
git reset HEAD <file>...
: 取消暂存文件;
8.3 撤销对文件的修改
git checkout -- <file>...
: 丢弃工作目录中的更改(危险命令)。