1. 基本操作
(1) git init
功能:初始化仓库。
要使用 Git 进行版本管理,必须先初始化仓库。如果初始化成功,执行了 **git init
**命令的目录下就会生成 .git
目录。这个 .git
目录里存储着管理当前目录内容所需的仓库数据。
在 Git 中,我们将工作目录的内容称为“附属于该仓库的工作树
”。文件的编辑等操作在工作树中进行,然后记录到仓库中,以此管理文件的历史快照。如果想将文件恢复到原先的状态,可以从仓库中调取之前的快照,在工作树中打开。开发者可以通过这种方式获取以往的文件。
(2) git status
功能:显示 Git 仓库的状态。
工作树和仓库在被操作的过程中,状态会不断发生变化。在 Git 操作过程中时常用 **git status
**命令查看当前状态,可谓基本中的基本。
(3) git add
功能:向暂存区中添加文件。
如果只是用 Git 仓库的工作树创建了文件,那么该文件并不会被记入 Git 仓库的版本管理对象当中。因此如果我们用 **git status
**命令查看新创建的文件时,它会显示在 Untracked files
里。要想让文件成为 Git 仓库的管理对象,就需要用 **git add
**命令将其加入暂存区(Stage
或者 Index
)中。暂存区是提交之前的一个临时区域。
option为.
, -A
, -u
的区别:
git add -A
stages Allgit add .
stages new and modified, without deletedgit add -u
stages modified and deleted, without new
Ref:
http://stackoverflow.com/a/572660
(4) git commit
功能:保存仓库的历史记录。
此命令可以将当前暂存区中的文件实际保存到仓库的历史记录中。通过这些记录,我们就可以在工作树中复原文件。
记述一行提交信息: git commit -m "your commit"
记述详细提交信息: git commit
, 然后编辑器会自动启动,在文件内添加至少三行,格式如下(默认存在的注释行不必删除):
- 第一行:用一行文字简述提交的更改内容
- 第二行:空行
- 第三行以后:记述更改的原因和详细内容
中止提交: 如果在编辑器启动后想中止提交,请将提交信息留空(不包括默认存在的#注释行)并直接关闭编辑器,随后提交就会被中止。
git commit -am "commit content"
: 当你只想提交tracked 文件时,使用此命令代替**git add
和git commit -m
。如果commit中包含新建的文件(untracked),你就必须首先使用git add <file-name>
将此文件添加到暂存区,然后使用git commit
**命令。
(5) git log
功能: 查看以往仓库中提交的日志。
日志内容包括可以查看什么人在什么时候进行了提交或合并,以及操作前后有怎样的差别。
只显示提交信息的第一行: git log --pretty=short
只显示指定目录、文件的日志: git log README.md
显示文件的改动: git log -p
(6) git diff
功能: 查看更改前后的差别。
**git diff
**命令可以查看 工作树、暂存区、最新提交之间的差别。
查看工作树和暂存区的差别: git diff
, 也就是查看工作树版本与未add
的版本的区别。
查看暂存区与最新提交版本的差别: git diff --cached
或git diff --staged
。
查看工作树与最近commit的版本的区别:git diff HEAD
,也就是查看工作树版本与最新提交的版本的区别。
比较当前版本和上一个版本差异:git diff HEAD^
养成这样一个好习惯:在执行 **git commit
命令之前先执行git diff HEAD
**命令,查看本次提交与上次提交之间有什么差别,等确认完毕后再进行提交。这里的 HEAD
是指向当前分支中最新一次提交的指针。
查看任意两个版本的区别: git diff v1 v2
。
2. 分支操作
(1) 显示所有本地分支
git branch
当前所在分支带有*
显示所有分支,包括远程分支:
git branch -a
(2) 创建分支
git branch <branch-name>
(3) 切换分支
git checkout <branch-name> # 切换已经存在的本地分支
git checkout -b <branch-name> # 创建本地分支,并切换
git checkout -b <branch-name> origin/<branch-name> # 创建跟远程一样的本地分支,并切换
切换回上一个分支:
git checkout -
(4)删除本地分支
git branch -d <branch_name>
(5)删除远程分支
git push origin --delete <branch_name>
(4) 特性分支
特性分支顾名思义,是集中实现单一特性(主题),除此之外不进行任何作业的分支。在日常开发中,往往会创建数个特性分支,同时在此之外再保留一个随时可以发布软件的稳定分支。稳定分支的角色通常由 master
分支担当。
基于特定主题的作业在特性分支中进行,主题完成后再与 master
分支合并。只要保持这样一个开发流程,就能保证 master
分支可以随时供人查看。
(5) 合并分支
首先切换到 master
分支,然后合并:
git checkout master
git merge --no-ff <branch-name>
(6) 以图表形式查看分支
git log --graph
3. 更改提交的操作
(1) git reset
功能: 回溯历史版本
分三步:
-
获取历史commit的哈希值
git reflog
命令结果e.g.:
4f2a403 HEAD@{2}: checkout: moving from jiang-branch to master 4f2a403 HEAD@{3}: checkout: moving from master to jiang-branch 4f2a403 HEAD@{4}: checkout: moving from jiang-branch to master 4f2a403 HEAD@{5}: checkout: moving from wang-branch to jiang-branch 4f2a403 HEAD@{6}: checkout: moving from master to wang-branch 4f2a403 HEAD@{7}: commit: none b493fc7 HEAD@{8}: commit: Add 02cc03c HEAD@{9}: commit (initial): Initial commit
我们根据日志,可以获得数次commit操作的哈希值(
HEAD
之前的字符串) -
选择你需要回溯的版本的哈希值,运行以下命令:
git reset --hard <hash value>
-
你需要将你的回溯push到remote(比如github):
git push -f origin master
(2) 合并冲突
冲突产生
我们假设有两个branch,一个叫han-branch
一个是master
;假设han-branch
来自于master的上次commit。从同一个commit出发,两个branch对同一段代码有了不同的修改,merge
时,冲突就出现了。
冲突的格式
这是冲突的一个例子:
<<<<<<< HEAD
print "I'am master-branch"
=======
print "I'am han-branch"
>>>>>>> han-branch
=======
是分隔符,上面的是当前branch的冲突部分;下面是被merge的branch的冲突部分。
解决冲突
你可以直接编辑冲突文件,消除冲突。
冲突解决后,使用以下命令:
git add <file-name>
git commit
(3) git commit --amend
功能: 修改上一条提交信息
命令执行之后,编辑器被打开,你可以修改你的提交信息。
(4) git rebase -i
功能: 压缩历史commit
在合并特性分支之前,如果发现已提交的内容中有些许拼写错误等,不妨提交一个修改,然后将这个修改包含到前一个提交之中,压缩成一个历史记录(commit)。这是个会经常用到的技巧。
举个栗子:
使用**git rebase -i HEAD~2
**: 将最后两个commit压缩。运行命令后,编辑器会打开,你可以按照注释的建议修改。
需要编辑的文件例子如下:
pick 59a8f42 merge login branch
pick 2a5b7ec spell correction
# Rebase 48d5404..2a5b7ec onto 48d5404 (2 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
解释:
(不包括注释语句)下面一行是最新一次提交,上面一行是它之前的提交。前者做了merge工作,后者只做了一次拼写纠错。我们觉得后面的提交似乎存在的意义不大,便想把它合并到前面的提交中去。我们将第二行的pick
替换为fixup
,就将后面的commit混合进前面的commit里面去了。
4. 推送至远程仓库
(1) git remote add
功能: 添加远程仓库
用法:git remote add <name> <url>
url
是你远程仓库的url,name
是你为远程仓库url起的一个名字,通常我们叫origin
。于是我们建立了一个映射: name --> url
。
例子:
git remote add origin https://github.com/wangjiang0624/TestGit
(2) git push
功能: 推送至远程仓库
用法: git push <-option> <remote-repo-name> <local-branch>:<remote-branch>
例子:
git push origin master:master
远程branch可以省略,此时若远程分支不存在,会自动建立与本地分支同名的远程分支。此时可以写成:git push origin master
5. 获取远程仓库
(1) git clone
功能: 获取远程仓库
用法: git clone <remote-repo-url>
clone之后默认只获取master
分支,所以你如果需要获取其他分支,还需要输入以下命令:
git checkout -b <branch-name> origin/<branch-name>
(2) git pull
功能: 获取最新的远程仓库分支
用法: git pull origin <remote-branch-name>
6. 标签操作
(1)创建本地标签
git tag <tag_name>
(2)把本地标签push到远程
git push origin <tag_name>
7. reset撤销
(1)撤销本地commit
git reset HEAD~
8. revert操作(已push)
(1)revert到上一个版本
git revert HEAD
git push
(2)revert到某个版本
git checkout <commit_id> .
git commit -m "<comment>"
git push
Ref
《Github入门与实践》
http://www.ruanyifeng.com/blog/2014/06/git_remote.html