git 常用bash命令

Table of Contents

1 git 常用bash命令

1.1 远程仓库相关命令

  1. 检出仓库
    $ git clone git://github.com/xx/xx.git
    
  2. 检出仓库
    $ git clone -o github -b 2.0.0 git://github.com/xx/xx.git xx2
    

    直接检出分支 2.0.0,指定远程仓库名称为 github (默认为 origin)、检出到文件夹 xx2 (默认为 xx)

  3. 查看远程仓库
    $ git remote -v
    
  4. 添加远程仓库
    $ git remote add [name] [url]
    
  5. 删除远程仓库
    $ git remote rm [name]
    
  6. 修改远程仓库
    $ git remote set-url --push [name] [newUrl]
    
  7. 拉取远程仓库
    $ git pull [remoteName] [localBranchName]
    
  8. 推送远程仓库
    $ git push [remoteName] [localBranchName]
    
  9. 强制推送更改
    $ git push --force origin master
    

    如果想把本地的某个分支test提交到远程仓库,并作为远程仓库的master分支,或者作为另外一个名叫test的分支,如下:

    $ git push origin test:master         // 提交本地test分支作为远程的master分支
    $ git push origin test:test           // 提交本地test分支作为远程的test分支
    

1.2 分支(branch)操作相关命令

  1. 查看本地分支
    $ git branch
    
  2. 查看远程分支
    $ git branch -r
    

    如果还是看不到就先 git fetch origin

  3. 先创建本地分支
    $ git branch [name]
    

    注意新分支创建后不会自动切换为当前分支

  4. 切换分支
    $ git checkout [name]
    
  5. 创建新分支并立即切换到新分支
    $ git checkout -b [name]
    
  6. 直接检出远程分支
    $ git checkout -b [name] [remoteName] (如:git checkout -b myNewBranch origin/dragon)
    
  7. 删除分支
    $ git branch -d [name] ---- -d选项只能删除已经参与了合并的分支,对于未有合并的分支是无法删除的。如果想强制删除一个分支,可以使用-D选项
    
  8. 合并分支
    $ git merge [name]
    

    将名称为[name]的分支与当前分支合并

  9. 合并最后的2个提交
    $ git rebase -i HEAD~2
    

    数字2按需修改即可(如果需提交到远端

    $ git push -f origin master
    

    慎用)

  10. 创建远程分支(本地分支push到远程)
    $ git push origin [name]
    
  11. 删除远程分支
    $ git push origin :heads/[name] 或 $ git push origin :[name]
    
  12. 修改本地分支名称
    git branch -m <old_branch_name> <new_branch_name>
    
  13. 直接修改远程分支名称(不修改本地的)
    git push <remote> <remote>/<old_name>:refs/heads/<new_name> :<old_name>
    
  14. 修改本地及其远程分支的名称
    1. git branch -m <old_name> <new_name>
    2. git push <remote> --set-upstream new_name
    3. git push <remote> :old_name
    4. git fetch <remote>
    5. git remote prune <remote>
    

1.3 创建空的分支

执行命令之前记得先提交你当前分支的修改,否则会被强制删干净没得后悔

  1. 方法1
    $ git checkout --orphan <branch_name>
    $ git rm -rf *
    
  2. 方法2
    $ git symbolic-ref HEAD refs/heads/[name]
    $ rm .git/index
    $ git clean -fdx
    

1.4 版本(tag)操作相关命令

  1. 查看版本
    $ git tag
    
  2. 创建版本
    $ git tag [name]
    
  3. 删除版本
    $ git tag -d [name]
    
  4. 查看远程版本
    $ git tag -r
    
  5. 创建远程版本(本地版本push到远程)
    $ git push origin [name]
    
  6. 删除远程版本
    $ git push origin :refs/tags/[name]
    
  7. 合并远程仓库的tag到本地
    $ git pull origin --tags
    
  8. 上传本地tag到远程仓库
    $ git push origin --tags
    
  9. 创建带注释的tag
    $ git tag -a [name] -m 'yourMessage'
    

1.5 子模块(submodule)相关操作命令

  1. 添加子模块
    $ git submodule add [url] [path]
    

    如:$ git submodule add git://github.com/soberh/ui-libs.git src/main/webapp/ui-libs

  2. 初始化子模块
    $ git submodule init  ----只在首次检出仓库时运行一次就行
    
  3. 更新子模块
    $ git submodule update ----每次更新或切换分支后都需要运行一下
    
  4. 删除子模块(分4步走哦)
    1) $ git rm --cached [path]
    2) 编辑“.gitmodules”文件,将子模块的相关配置节点删除掉
    3) 编辑“ .git/config”文件,将子模块的相关配置节点删除掉
    4) 手动删除子模块残留的目录
    

1.6 忽略一些文件、文件夹不提交

在仓库根目录下创建名称为“.gitignore”的文件,写入不需要的文件夹名或文件,每个元素占一行即可,如
target
bin
*.db

1.7 回退

  1. 删除当前仓库内未受版本管理的文件
    $ git clean -f
    
  2. 恢复仓库到上一次的提交状态
    $ git reset --hard
    
  3. 回退所有内容到上一个版本
    $ git reset HEAD^
    
  4. 回退a.py这个文件的版本到上一个版本
    $ git reset HEAD^ a.py
    
  5. 回退到某个版本
    $ git reset 057d
    
  6. 将本地的状态回退到和远程的一样
    $ git reset –hard origin/master
    
  7. 向前回退到第3个版本
    $ git reset –soft HEAD~3
    
  8. 修改最后的提交日志
    $ git commit --amend
    
  9. 修改最后的提交日期为当前时间
    $ git commit --amend  --date="$(date -R)"
    

1.8 Git一键推送多个远程仓库

  1. 编辑本地仓库的.git/config文件
    [remote "all"]
    url = git@github.com:dragon/test.git
    url = git@gitcafe.com:dragon/test.git
    

    这样,使用git push all即可一键Push到多个远程仓库中。

1.9 缓存认证信息

$ git config credential.helper cache

1.10 查看提交日志

》查看文件中的每一行的作者、最新的变更提交和提交时间

$ git blame [fileName]
  1. Git常用操作命令
    • rongjih
  2. 查看仓库历史记录

    有三个应该知道的选项。

    - oneline -压缩模式,在每个提交的旁边显示经过精简的提交哈希码和提交信息,以一行显示。
    - graph -图形模式,使用该选项会在输出的左边绘制一张基于文本格式的历史信息表示图。如果你查看的是单个分支的历史记录的话,该选项无效。
    - all -显示所有分支的历史记录
    
  3. 把这些选项组合起来之后如下
    $ git log --oneline --graph
    

    –name-status 既可以看到简介的日志信息,也可以看到改了哪些文件,一举两得:

1.11 有选择的合并 - 这个功能最赞,没有之一

cherry-pick 可以从不同的分支中捡出一个单独的commit,并把它和你当前的分支合并。如果你以并行方式在处理两个或以上分支,你可能会发现一个在全部分支中都有的bug。如果你在一个分支中解决了它,你可以使用cherry-pick命令把它commit到其它分支上去,而不会弄乱其他的文件或commit。

$ git cherry-pick [commitHash]

1.12 Stash未提交的更改

正在修改某个bug或者某个特性,又突然被要求展示工作。而现在所做的工作还不足以提交,这个阶段还无法进行展示(不能回到更改之前)。在这种情况下, git stash可以帮到忙了。stash在本质上会取走所有的变更并存储它们以备将来使用。

$ git stash

检查stash列表:

$ git stash list

想解除stash并且恢复未提交的变更,就进行apply stash:

$ git stash apply

如果只想留有余地进行apply stash,给apply添加特定的标识符:

$ git stash apply stash@{0}

1.13 多次修改后拆分提交 - 暂存文件的部分改动

一般情况下,创建一个基于特性的提交是比较好的做法,意思是每次提交都必须代表一个新特性的产生或者是一个bug的修复。如果你修复了两个bug,或是添加了多个新特性但是却没有提交这些变化会怎样呢?在这种情况下,你可以把这些变化放在一次提交中。但更好的方法是把文件暂存(Stage)然后分别提交。 例如你对一个文件进行了多次修改并且想把他们分别提交。这种情况下,可以在 add 命令中加上 -p 参数

$ git add -p [fileName]

1.14 压缩多个Commit

用rebase命令把多个commit压缩成一个

git rebase -i HEAD~[number_of_commits]

如果你想要压缩最后两个commit,你需要运行下列命令:

git rebase -i HEAD~2

Docs: 7.6 Git 工具 - 重写历史 、3.6 Git 分支 - 变基

1.15 差异查看

$ git diff --name-status HEAD~2 HEAD~3 <-- 获得两个版本间所有变更的文件列表
$ git diff HEAD HEAD~1 <-- 查看最近两个提交之间的差异
$ git diff HEAD HEAD~2 <-- 查看第1个与第3个提交之间的差异
$ ^ - 代表父提交,^n 表示第n个父提交,^相当于^1 git寻根:^和~的区别 - 分析得很到位
$ ~ - 代表连续的提交,~n相当于连续的第n个提交
$ git diff master..test <-- 比较两个分支之间的差异
$ git diff master...test <-- 比较master、test的共有父分支和 test 分支之间的差异
$ git diff test <-- 比较当前工作目录与 test 分支的差异
$ git diff HEAD <-- 比较当前工作目录与上次提交的差异
$ git diff HEAD -- ./lib  <-- 比较当前工作目录下的lib目录与上次提交的差异
$ git diff --stat  <-- 统计一下有哪些文件被改动,有多少行被改动
$ git diff --cached  <-- 查看下次提交时要提交的内容(staged,添加到索引中)