Git使用总结

基本概念

我们先来理解下 Git 工作区、暂存区和版本库概念:

  • 工作区:就是你在电脑里能看到的目录。
  • 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
  • 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。

下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:

git

  • 图中左侧为工作区,右侧为版本库。在版本库中标记为 “index” 的区域是暂存区(stage/index),标记为 “master” 的是 master 分支所代表的目录树。
  • 图中我们可以看出此时 “HEAD” 实际是指向 master 分支的一个”游标”。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。

配置相关

如果首次使⽤Git,那刚开始首先是需要配置身份信息。

配置全局账户

全局账户就是该账户对所有的 Git 仓库都有效

1
2
git config --global user.name '你的账户名称' 
git config --global user.email '你的 Email'

配置局部账户

局部账户也就是该账户只对当前Git仓库有效

1
2
git config --local user.name '你的账户名称' 
git config --local user.email '你的 Email'

查看相关配置情况

  • 查看全局的配置情况
1
git config --global --list
  • 查看某个仓库下的配置情况
1
git config --local --list

本地基本操作

git

基本操作

  • 初始化Git仓库
1
git init
  • 拷贝项目
1
git clone <repo> <directory> // repo: Git仓库,directory: 本地目录,默认为当前目录
  • 查看变更情况
1
git status
  • 查看当前⼯工作在哪个分⽀上
1
git branch -v
  • 切换到指定分⽀
1
git checkout 分⽀的名称
  • 把当前⽬录及其子目录下所有变更都加⼊到暂存区
1
git add .
  • 把仓库内所有变更都假如到暂存区
1
git add *
  • 把指定⽂件添加到暂存区
1
git add ⽂文件1 ⽂文件2 ... ⽂文件n
  • 创建正式的 commit,也就是把当前的数据提交上去
1
git commit

比较差异

  • 比较某文件⼯作区和暂存区的差异
1
git diff 某⽂文件
  • 比较某文件暂存区和HEAD的差异
1
git diff --cache 某⽂文件
  • 比较⼯作区和暂存区的所有差异
1
git diff
  • 比较暂存区和HEAD的所有差异
1
git diff --cache

暂存区与⼯作区之间回滚

  • 把工作区指定⽂件恢复成和暂存区⼀样
1
git checkout 文件1 ⽂件2 ... 文件n
  • 把暂存区指定⽂件回复和HEAD一样
1
git reset ⽂件1 ⽂件2 ... 文件n
  • 把暂存区和工作区所有文件恢复成和HEAD一样
1
git reset --hard
  • ⽤difftool比较任意两个commit的差异
1
git difftool commit1 commit2

注意: 从工作区回滚到暂存区则⽤checkout,否则⽤reset

其他

  • 查看哪些⽂件没有被Git管控
1
git ls-files --others

加塞临时任务处理

  • 把未处理理完的变更先保存到stash中
1
git stash
  • 临时任务处理完后继续之前的⼯工作
1
2
git stash pop // pop 相当于栈的出栈和⼊入栈⼀一样,把之前的任务弹出来
git stash apply // 和 pop 不不同的是, apply 相当于从栈顶把任务取出来,但是不不过从栈中把任 务移除
  • 查看所有的stash
1
git stash list
  • 取回某次 stash 的变更
1
git stash pop stash @{数字n}

日志

  • 查看commit日志, ⽤一⾏显示
1
git log --oneline
  • 显示最近的n个commit
1
git log -n
  • ⽤图示显示所有的分⽀历史
1
git log --oneline --graph --all
  • 查看涉及到某⽂件变更更的所有
1
commit git log 某⽂文件
  • 查看指定文件的修改记录
1
git blame <file>

分支

创建新分⽀支

  • 基于当前分⽀支创建新分⽀
1
git branch 新分⽀支
  • 基于指定分⽀支创建新分⽀
1
git branch 新分⽀支 已有分⽀
  • 基于某个commit创建分⽀
1
git branch 新分⽀支 某个commit的id
  • 创建分⽀支并且切换到该分⽀
1
git chechout -b 新分⽀

列出分⽀

  • 列出本地分⽀
1
git branch -v
  • 列出本地和远端分⽀
1
git branch -av
  • 列出远端所有分⽀
1
git branch -rv
  • 列出名称符号某样式的远端分⽀
1
git branch -rv -l '某样式'

删除分⽀

  • 安全删除本地某分⽀
1
git branch -d 要删除的分⽀
  • 强⾏删除本地分⽀
1
git branch -D 要删除的分⽀支
  • 删除已合并到 master 分⽀的所有本地分⽀
1
git branch --merged master | grep -v '^\*\| master' | xargs -n 1 git branch -d
  • 删除远端 origin 已不不存在的所有本地分⽀
1
git remote prune origin

修改分支历史

我们的仓库的内容每次变更执⾏commit的时候,都会⽣成一个新的commit,不过有时候,我们不想产⽣新的commit,⽽是想要通过修改之前的commit来变更仓库的内容,那么就可以使⽤用如下命令了。

  • 修改最后一次commit
1
2
git add
git commit --amend
  • 修改中间的commit(假设代号为X)
1
2
3
gt rebase -i X  // 前面的⼀个commit的id 
git add
git rebase --contiue

两分支之间的集成

  • 把A分支合入到当前分⽀,且为merge创建commit
1
git merge A分⽀支
  • 把A分⽀合⼊到B分⽀,且为Merge创建commit
1
git merge A分⽀支 B分⽀支
  • 把当前分⽀支基于B分⽀支做 rebase,以便便把B分⽀支合⼊入到当前分⽀支
1
git rebase B分⽀支
  • 把A分⽀支基于B分⽀支做rebase,以便便把B分⽀支合⼊入到A分⽀支
1
git rebase B分⽀支 A分⽀支

标签

  • 打标签
1
git tag 标签名
  • 从commit打上标签
1
git tag 标签名 commit的id
  • 查看已有标签
1
git tag
  • 查看标签版本所修改的内容
1
git show 标签名
  • 删除标签
1
git tag -d 标签名

远程仓库操作

  • 列出所有的远程仓库
1
git remote -v
  • 增加远程仓库版本
1
git remote add [shortname] [url]

示例:

1
2
git remote add origin git@github.com:tianqixin/runoob-git-test.git
git push -u origin master

  • 删除远程仓库
1
git remote rm name
  • 修改远程仓库名
1
git remote rename old_name new_name
有用就打赏一下作者吧!