Git常用操作命令分级/以及和Gerrit的联用基础
经常看到如何使用git,但是,往往很多命令都没用过,也没有分级,那些是最常用的,那些是常用的,那些是必须记住的命令.本文根据工作尝试整理一下.默认的使用者不是项目配置工程师,而是开发者:一般最常用,且必须记住的: 用粗体蓝色,不常用但是,高级开发常用的用粗体红色
1 Git 常用命令表:
1.1 最常用的命令,无需记忆,因为你常用:
git log
git status
git diff .
git add
git commit --amend
git push
git blame
git branch
* 如果想把本地的某个分支test提交到远程仓库,并作为远程仓库的master分支,或者作为另外一个名叫test的分支,如下:$ git push origin test:master // 提交本地test分支作为远程的master分支$ git push origin test:test // 提交本地test分支作为远程的test分支
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: $ git checkout --orphan <branch_name> $ git rm -rf * 方法2: $ git symbolic-ref HEAD refs/heads/[name] $ rm .git/index $ git clean -fdx
3)版本(tag)操作相关命令查看版本:$ git tag创建版本:$ git tag [name]删除版本:$ git tag -d [name]查看远程版本:$ git tag -r创建远程版本(本地版本push到远程):$ git push origin [name]删除远程版本:$ git push origin :refs/tags/[name]合并远程仓库的tag到本地:$ git pull origin --tags上传本地tag到远程仓库:$ git push origin --tags创建带注释的tag:$ git tag -a [name] -m 'yourMessage'
4) 子模块(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) 手动删除子模块残留的目录
5)忽略一些文件、文件夹不提交在仓库根目录下创建名称为“.gitignore”的文件,写入不需要的文件夹名或文件,每个元素占一行即可,如targetbin*.db
6)后悔药删除当前仓库内未受版本管理的文件:$ 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
7)Git一键推送多个远程仓库编辑本地仓库的.git/config文件:[remote "all"] url = git@github.com:dragon/test.git url = git@gitcafe.com:dragon/test.git这样,使用git push all即可一键Push到多个远程仓库中。
8)缓存认证信息$ git config credential.helper cache
9)查看提交日志》查看文件中的每一行的作者、最新的变更提交和提交时间$ git blame [fileName]1e3d0777 (Username 2016-03-26 20:53:45 +0800 9) #ifdef __cplusplus
》查看仓库历史记录有三个应该知道的选项。--oneline - 压缩模式,在每个提交的旁边显示经过精简的提交哈希码和提交信息,以一行显示。--graph - 图形模式,使用该选项会在输出的左边绘制一张基于文本格式的历史信息表示图。如果你查看的是单个分支的历史记录的话,该选项无效。--all - 显示所有分支的历史记录把这些选项组合起来之后如下:使用 $ git log --oneline --graph --name-status 既可以看到简介的日志信息,也可以看到改了哪些文件,一举两得:
10)有选择的合并 - 这个功能最赞,没有之一cherry-pick 可以从不同的分支中捡出一个单独的commit,并把它和你当前的分支合并。如果你以并行方式在处理两个或以上分支,你可能会发现一个在全部分支中都有的bug。如果你在一个分支中解决了它,你可以使用cherry-pick命令把它commit到其它分支上去,而不会弄乱其他的文件或commit。$ git cherry-pick [commitHash]
11)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}
12)多次修改后拆分提交 - 暂存文件的部分改动一般情况下,创建一个基于特性的提交是比较好的做法,意思是每次提交都必须代表一个新特性的产生或者是一个bug的修复。如果你修复了两个bug,或是添加了多个新特性但是却没有提交这些变化会怎样呢?在这种情况下,你可以把这些变化放在一次提交中。但更好的方法是把文件暂存(Stage)然后分别提交。例如你对一个文件进行了多次修改并且想把他们分别提交。这种情况下,可以在 add 命令中加上 -p 参数$ git add -p [fileName]
13)压缩多个Commit用rebase命令把多个commit压缩成一个git rebase -i HEAD~[number_of_commits]如果你想要压缩最后两个commit,你需要运行下列命令:git rebase -i HEAD~2Docs: http://git-scm.com/book/en/v2/Git-Branching-Rebasing
14)差异查看$ 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,添加到索引中)
15)Git for Windows 中文乱码问题 (1.9.4-preview20140611)》git log 显示的文件名乱码执行 "git config –global core.quotepath false"可以解决之。core.quotepath设为false,就不会对0×80以上的字符进行quote,中文就显示正常。修正前:修正后:》ls命令显示的中文名乱码改用"ls --show-control-chars"命令代替单纯的"ls"命令即可。或者编辑.../Git/etc/git-completion.bash,新增一行 alias ls="ls –show-control-chars"
Gerrit的联用基础
ref:
1 http://rongjih.blog.163.com/blog/static/335744612010112562833316/
2 http://blog.csdn.net/ithomer/article/details/7529022