Git使用宝典

基础知识

Git有三种状态:已修改(modified)、已暂存(staged)和已提交(committed)

基础命令

准备工作

$ git init <project-name>
初始化一个本地资源库
$ git clone <url>
下载工程,包括它完整的版本记录
$ git status
查看当前仓库的状态
$ git add <file>
开始跟踪一个文件,使用文件或目录的路径作为参数;如果参数是目录的路径,该命令将递归地跟踪该目录下的所有文件。可以用.添加所有文件
$ git log
显示从最近到最远的提交日志

git commit

$ git commit -m “[descriptive message]”
提交暂存区中的文件到资源库
$ git commit -a -m “message”
跳过使用暂存区域直接提交
$ git commit -m ‘
注释可以通过单引号来换行,以’开始,并以’结束
$ git commit --amend
合并缓存的修改和上一次的提交,用新的快照替换上一个提交。缓存区没有文件时运行这个命令可以用来编辑上次提交的提交信息,而不会更改快照。
$ git commit --amend --author “NewAuthor <NewAuthor@address.com>“ 或 $ git commit --amend --reset-author
修改最近一次提交的用户名和邮箱

git rm

$ git rm <file>
删除文件
$ git rm --cached <file>
停止跟踪文件但不删除

git reset

HEAD 在Git中,它是一个指针,指向当前所在的本地分支(可以将 HEAD 想象为当前分支的别名)

在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

$ git reset HEAD <file>
可以把暂存区的修改撤销掉(unstage),重新放回工作区,文件内容不会有变化
$ git reset HEAD .
可以删除暂存区中的所有文件,重新放回工作区
$ git reset HEAD
若不像上面那样指定某个文件的话,是直接将暂存区的所有文件重新放回工作区
$ git reset <commit>
撤销<commit>之后的所有提交,保留本地更改
$ git reset --hard <commit>
丢弃所有历史更改(包括工作区和暂存区),然后回退到指定的commit,如git reset --hard HEAD^ 回退到上一版本

git checkout

$ git checkout -- <file>
可以丢弃工作区的修改,命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令
$ git checkout .
会用版本库全部文件替换工作区的文件(丢弃工作区中的所有文件修改)
$ git checkout <name>
切换分支
$ git checkout -b <name>
创建+切换分支

分支管理

git branch

$ git branch
会列出本地所有分支,当前分支前面会标一个*号
$ git branch -a
会列出本地和远程追踪分支
$ git branch <name>
创建分支
$ git branch -d <name>
删除分支
$ git branch -D <name>
强行删除,如丢弃一个没有被合并过的分支

git merge

$ git merge <branch-name>
合并某分支到当前分支
$ git merge --abort
取消合并操作,如合并时遇到冲突想取消操作

git rebase

$ git rebase
变基,将提交到某一分支上的所有修改都移至另一分支上
$ git rebase --continue
若上一步有冲突不能自动合并时,待冲突解决后,执行该命令
$ git rebase --skip
跳过这次提交
$ git rebase --abort
中止

远程操作

git remote

$ git remote
查看远程库的信息
$ git remote -v
显示更详细的信息
$ git remote show <remote-name>
查看某一个远程仓库的更多信息
$ git remote add <name> <remote-url>
关联一个远程库,如git remote add origin git@server-name:path/repo-name.git

git fetch

$ git fetch <remote-name>
默认取回所有分支,没有remote指定时默认使用origin,除非已为当前分支配置了上游分支
$ git fetch <remote-name> <branch-name>
取回特定分支的更新,如取回origin主机的master分支,git fetch origin master
$ git fetch --all
获取所有远程
$ git fetch origin --prune
清除远程已经删掉,但本地还存在的僵尸分支

注意:所取回的更新,在本地主机上要用”远程主机名/分支名“的形式读取。比如origin主机的master,就要用origin/master读取

git pull

git pull = git fetch + git merge

$ git pull
从远程抓取分支,默认也是拉取所有分支
$ git pull --all
拉取所有远程分支并尝试合并,但只会尝试合并当前所在分支的更改
$ git pull <远程主机名> <远程分支名>:<本地分支名>
如取回origin主机的next分支,与本地的master分支合并,需要写成git pull origin next:master。 如果远程分支是与当前分支合并,则冒号后面的部分可以省略:git pull origin next

git push

$ git push <remote-name> <branch-name>
从本地推送分支,如git push origin serverfix
$ git push <remote-name> --delete <branch-name>
删除远程分支,如git push origin --delete serverfix
$ git push origin <tagname>
可以推送一个本地标签
$ git push origin --tags
可以推送全部未推送过的本地标签
$ git push origin :refs/tags/<tagname>
可以删除一个远程标签

git tag

$ git tag
查看所有标签
$ git tag <name>
打一个新标签 ,默认为HEAD,也可以指定一个commit id
$ git tag -a <tagname> -m “blablabla…”
可以指定标签信息
$ git tag -d <tagname>
可以删除一个本地标签
$ git show <tagname>
查看标签信息

远程分支关联

$ git checkout -b <branch-name> <remote-name>/<branch-name>
在本地创建和远程分支对应的分支,本地和远程分支的名称最好一致。如git checkout -b serverfix origin/serverfix。由于该命令比较常用,提供了快捷方式:git checkout --track origin/serverfix
$ git branch --set-upstream <branch-name> origin/branch-name
建立本地分支和远程分支的关联【不推荐使用--set-upstream,改用--track或--set-upstream-to 】
$ git branch --set-upstream-to=origin/branch-name
建立本地分支和远程分支的关联,本地分支默认是当前分支,名字可以与远程分支不一样

其他常用命令

git stash

$ git stash
可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作
$ git stash list
查看已经保存的工作现场
$ git stash apply
恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除
$ git stash pop
恢复的同时把stash内容也删了
$ git stash show -p stash@{0}
查看第一个最近stash的变化
$ git stash drop stash@{0}
删除第一个暂存内容
$ git stash clear
删除所有暂存

非常用命令

$ git reflog
查看命令历史
$ git log --graph --pretty=oneline --abbrev-commit
可以看到分支的合并情况
$ git log --graph
命令可以看到分支合并图
$ git config --list
命令来列出所有 Git 当时能找到的配置
$ git checkout -b <branch-name> <tag-name>
在特定的标签上创建一个新分支