作者:LogM
本文原载于 https://segmentfault.com/u/logm/articles ,不允许转载~
1. 克隆
git clone <版本库的网址>
git clone <版本库的网址> <本地目录名>
# 克隆版本库的时候,所使用的远程主机自动被git命名为origin
# 使用-o修改远程主机名
git clone -o <远程主机名> <版本库的网址>
2. 查看历史
# 查看历史的每一次操作
git reflog
# 查看历史commit
git log
git log --oneline
# 查看commit的修改
git show <commit_id>
git show --stat <commit_id>
git show <commit_id> <filename>
# 查看两个分支的差异
git diff <branch1> <branch2>
git diff --stat <branch1> <branch2>
# 查看某个文件的改动,还未add
git diff <filename>
# 查看已经add的文件相比上一次commit有哪些改动
git diff --cached
3. 远程主机管理
# 列出所有的远程主机名
git remote
# 参看远程主机的网址
git remote -v
# 查看主机的详细配置
git remote show <主机名>
# 添加远程主机
git remote add <主机名> <网址>
# 删除远程主机
git remote rm <主机名>
# 远程主机改名
git remote rename <原主机名> <新主机名>
4. 分支管理
# 将远程主机新的更新取回本地,默认取回所有branch的更新
# 它取回的代码对你本地的开发代码没有影响(只是让 `git branch -a` 显示出远程新增的branch,不修改本地代码)
git fetch <远程主机名>
# 取回远程主机的特定branch
git fetch <远程主机名> <分支名>
# 查看远程分支
git branch -r
# 查看所有分支
git branch -a
# 在origin/master的基础上,新建本地分支
git checkout -b newBrach origin/master
# 相当于执行
git branch newBrach
git checkout newBrach
# 查看跟踪关系
git branch -vv
# 手动建立追踪关系
git branch --set-upstream-to=origin/remoteBranch localBranch
# 删除本地分支
git branch -d <BranchName>
5. 拉回更新
# 取回远程主机某个分支的更新,再与本地的指定分支合并
# 实质上,这等同于先做git fetch,再做git merge
git pull <远程主机名> <远程分支名>:<本地分支名>
# 采用rebase模式,可以使用--rebase选项
git pull --rebase <远程主机名> <远程分支名>:<本地分支名>
# 如果远程分支是与当前分支合并,则冒号后面的部分可以省略
git pull <远程主机名> <远程分支名>
# 如果本地的当前分支在远程主机上已经有追踪关系的分支,可以省略分支名
git pull <远程主机名>
# 如果只有一个追踪的分支,则可以省略主机名
git pull
# 如果远程主机删除了某个分支,默认情况下,git pull 不会在拉取远程分支的时候,删除对应的本地分支
# 加上参数 -p 就会在本地删除远程已经删除的分支
git pull -p
# 等同于
git fetch --prune origin
git fetch -p
6. 推送更新
# 将本地分支的更新,推送到远程主机
git push <远程主机名> <本地分支名>:<远程分支名>
# 如果省略远程分支名,则表示将本地分支推送与之存在"追踪关系"的远程分支,如果该远程分支不存在,则会被新建
git push origin master
# 如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支
git push origin :master
# 等同于
git push origin --delete master
# 如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略
git push origin
# 如果当前分支只有一个追踪分支,那么主机名都可以省略
git push
# 还有一种情况,就是不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机,这时需要使用--all选项
git push --all origin
# 如果远程主机的版本比本地版本更新,推送时Git会报错,应当先pull合并代码。如果你一定要推送,可以使用--force选项
git push --force origin
# git push不会推送标签(tag),除非使用--tags选项
git push origin --tags
7. 代码回滚
# 文件被修改了,但未执行git add操作
git checkout fileName
# 同时对多个文件执行了git add操作,但本次只想提交其中一部分文件
# 取消暂存
git reset HEAD <filename>
# 文件执行了git add操作,但想撤销对其的修改
# 取消暂存
git reset HEAD fileName
# 撤销修改
git checkout fileName
# 修改的文件已被git commit,但想再次修改不再产生新的Commit
# 修改最后一次提交
$ git add fileName
$ git commit --amend -m"说明"
# 已在本地进行了多次git commit操作,现在想撤销到其中某次Commit
git reset [--hard|soft|mixed|merge|keep] [commit|HEAD]
# hard:重设index和working directory,从<commit>以来在working directory中的任何改变都被丢弃,并把HEAD指向<commit>
# soft:index和working directory中的内容不作任何改变,仅仅把HEAD指向<commit>。自从<commit>以来的所有改变都会显示在git status的“Changes to be committed”中
# mixed:仅重设index,但是不重设working directory。这个模式是默认模式,即当不显示告知git reset模式时,会使用mixed模式。这个模式的效果是,working directory中文件的修改都会被保留,不会丢弃,但是也不会被标记成“Changes to be committed”,但是会打出什么还未被更新的报告
# 将本地的状态回退到和远程一样
git reset --hard origin/devlop
# revert是放弃指定提交的修改,但是会生成一次新的提交,需要填写提交注释,以前的历史记录都在;
# reset是指将HEAD指针指到指定提交,历史记录中不会出现放弃的提交记录。