git 常用bash命令
Table of Contents
1 git 常用bash命令
1.1 远程仓库相关命令
- 检出仓库
$ git clone git://github.com/xx/xx.git
- 检出仓库
$ git clone -o github -b 2.0.0 git://github.com/xx/xx.git xx2
直接检出分支 2.0.0,指定远程仓库名称为 github (默认为 origin)、检出到文件夹 xx2 (默认为 xx)
- 查看远程仓库
$ git remote -v
- 添加远程仓库
$ git remote add [name] [url]
- 删除远程仓库
$ git remote rm [name]
- 修改远程仓库
$ git remote set-url --push [name] [newUrl]
- 拉取远程仓库
$ git pull [remoteName] [localBranchName]
- 推送远程仓库
$ git push [remoteName] [localBranchName]
- 强制推送更改
$ 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)操作相关命令
- 查看本地分支
$ git branch
- 查看远程分支
$ git branch -r
如果还是看不到就先 git fetch origin
- 先创建本地分支
$ git branch [name]
注意新分支创建后不会自动切换为当前分支
- 切换分支
$ git checkout [name]
- 创建新分支并立即切换到新分支
$ git checkout -b [name]
- 直接检出远程分支
$ git checkout -b [name] [remoteName] (如:git checkout -b myNewBranch origin/dragon)
- 删除分支
$ git branch -d [name] ---- -d选项只能删除已经参与了合并的分支,对于未有合并的分支是无法删除的。如果想强制删除一个分支,可以使用-D选项
- 合并分支
$ git merge [name]
将名称为[name]的分支与当前分支合并
- 合并最后的2个提交
$ git rebase -i HEAD~2
数字2按需修改即可(如果需提交到远端
$ git push -f origin master
慎用)
- 创建远程分支(本地分支push到远程)
$ git push origin [name]
- 删除远程分支
$ git push origin :heads/[name] 或 $ git push origin :[name]
- 修改本地分支名称
git branch -m <old_branch_name> <new_branch_name>
- 直接修改远程分支名称(不修改本地的)
git push <remote> <remote>/<old_name>:refs/heads/<new_name> :<old_name>
- 修改本地及其远程分支的名称
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.4 版本(tag)操作相关命令
1.5 子模块(submodule)相关操作命令
- 添加子模块
$ git submodule add [url] [path]
如:$ git submodule add git://github.com/soberh/ui-libs.git src/main/webapp/ui-libs
- 初始化子模块
$ git submodule init ----只在首次检出仓库时运行一次就行
- 更新子模块
$ git submodule update ----每次更新或切换分支后都需要运行一下
- 删除子模块(分4步走哦)
1) $ git rm --cached [path] 2) 编辑“.gitmodules”文件,将子模块的相关配置节点删除掉 3) 编辑“ .git/config”文件,将子模块的相关配置节点删除掉 4) 手动删除子模块残留的目录
1.6 忽略一些文件、文件夹不提交
在仓库根目录下创建名称为“.gitignore”的文件,写入不需要的文件夹名或文件,每个元素占一行即可,如 target bin *.db
1.7 回退
- 删除当前仓库内未受版本管理的文件
$ git clean -f
- 恢复仓库到上一次的提交状态
$ git reset --hard
- 回退所有内容到上一个版本
$ git reset HEAD^
- 回退a.py这个文件的版本到上一个版本
$ git reset HEAD^ a.py
- 回退到某个版本
$ git reset 057d
- 将本地的状态回退到和远程的一样
$ git reset –hard origin/master
- 向前回退到第3个版本
$ git reset –soft HEAD~3
- 修改最后的提交日志
$ git commit --amend
- 修改最后的提交日期为当前时间
$ git commit --amend --date="$(date -R)"
1.8 Git一键推送多个远程仓库
1.9 缓存认证信息
$ git config credential.helper cache
1.10 查看提交日志
》查看文件中的每一行的作者、最新的变更提交和提交时间
$ git blame [fileName]
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,添加到索引中)