常用git和repo命令
文章收集了最近使用的一些repo和git命令,下图是个人理解的git文件状态转换图。
更详细的Pro git 文档,更准确的应该是这样:
相关概念
名称 | 意义 |
---|---|
repo | 谷歌用Python脚本写的调用git的一个脚本,把git仓库统一管理起来的工具 |
Gerrit | 基于web的代码review及权限控制系统,面向基于 Git 版本控制系统 |
snapshot | 快照,某个时间点的所有文件集合 |
commitID | 40位哈希值,全球唯一 |
HEAD指针 | 指向当前工作分支 |
git分支 | 指向某一系列提交(commit)的指针或引用 |
svn与git命令的对比
svn | git |
---|---|
checkout | clone |
update | pull |
comit | push |
git常用命令
git log # 查看当前库的git log信息
git log -p -2 # -2 来仅显示最近两次提交
git show # 的命令显示当前HEAD上的最近一次的提交(commit)
git log -n1 -p # 同上
git status ./ # 查看当前库的状态
git reset HEAD~1 # 将当前库恢复到HEAD的上一个版本
git diff ./ # 比较当前库的修改情况
git add ./ # 将当前库的代码修改提交到暂存区
git commit ./ # 将代码提交到本地分支
git commit --file ../commit_log.txt # 指定messege文件
git commit --amend ./ # 追加修改
# git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤
# 如果你的提交信息(commit message)写错了且这次提交(commit)还没有推(push), 你可以通过下面的方法来修改提交信息(commit message)
git commit --amend --only -m 'xxxxxxx'
# 想从一个提交(commit)里移除一个文件
git checkout HEAD^ myfile
git add -A
git commit --amend
# 删除我的的最后一次提交(commit)
git reset HEAD^ --hard
git push -f [remote] [branch]
cd git_work # 找一个干净目录,假设是git_work
git clone http://myrepo.xxx.com/project/.git # 这样在git_work目录下得到一个project子目录
cd project
git branch -a # 列出所有分支名称如下:
remotes/origin/dev
remotes/origin/release
git checkout -b dev22 remotes/origin/release #是checkout远程release分支,在本地起名为dev22分支,并切换到本地的dev22分支
git checkout -b dev11 remotes/origin/dev # 作用参见上一步解释
git checkout dev22 #切换回release分支,并开始开发。
git pull # 更新本地仓库及本地暂存区及工作目录
git commit --author 'Freyll<hell@github.com>' --file ../commit_log.txt
git commit --amend --author 'Freyll<hell@github.com>' --file ../commit_log.txt
# commit_log.txt中添加Change-Id:Id89afdd8cb
git push origin HEAD:refs/dev22/master # 提交代码到远程分支
git branch -d dev22 # 删除本地分支dev22
其他命令
git config -l # 参看配置信息
git show HEAD^ # 查看HEAD的上一个版本信息
git show HEAD~4 # 查看HEAD的上溯4代的信息
git reset --hard HEAD^^ # 回退两个版本
git reset --hard 8308f03 # 回退到指定的commitID前7位的版本
git reset 9e5e64a # 将会使 master 指向 9e5e64a --hard 会强制覆盖了工作目录中的文件
git clean -dfx #清除库上没有的东西
git remote -v # 参看远程仓库
git branch -a # 参看远程分支
# 查看当前git分支所属
git branch -vv
git branch | grep "*"
# git log 附带一系列的总结性选项。如想看到每次提交的简略的统计信息,你可以使用 --stat 选项
git log --stat
# --shortstat 只显示 --stat 中最后的行数修改添加移除统计
# --name-status 显示新增、修改、删除的文件清单。
git log --oneline --decorate --graph --all # 图像显示git log信息
git log --pretty=format:"%h - %cd %s" --graph # 列出指定格式的log
git log -since="2 weeks ago" # 显示2周前到现在所有的历史记录
git reflog # 查看引用日志
# 从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交
git rm
# git mv ...
远程同步
# 下载远程仓库的所有变动
git fetch [remote]
# 显示所有远程仓库
git remote -v
# 显示某个远程仓库的信息
git remote show [remote]
# 增加一个新的远程仓库,并命名
git remote add [shortname] [url]
# 取回远程仓库的变化,并与本地分支合并
git pull [remote] [branch]
# 上传本地指定分支到远程仓库
git push [remote] [branch]
# 强行推送当前分支到远程仓库,即使有冲突
git push [remote] --force
# 推送所有分支到远程仓库
git push [remote] --all
# git fetch origin 会抓取克隆(或上一次抓取)后新推送的所有工作
# git fetch 命令会将数据拉取到你的本地仓库 - 它并不会自动合并或修改你当前的工作
git fetch [remote-name]
#如果你使用 clone 命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 “origin” 为简写。
#所以,git fetch origin 会抓取克隆(或上一次抓取)后新推送的所有工作。
#必须注意 git fetch 命令会将数据拉取到你的本地仓库 - 它并不会自动合并或修改你当前的工作。
#当准备好时你必须手动将其合并入你的工作。
#git clone 命令会自动设置本地 master 分支跟踪克隆的远程仓库的 master 分支(或不管是什么名字的默认分支)。
#运行 git pull 通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支
#当 git fetch 命令从服务器上抓取本地没有的数据时,它并不会修改工作目录中的内容。它只会获取数据然后让你自己合并。
#git pull 在大多数情况下它的含义是一个 git fetch 紧接着一个git merge 命令。
#不管它是显式地设置还是通过clone或checkout 命令为你创建的,git pull都会查找当前分支所跟踪的服务器与分支,从服务器上抓取数据然后尝试合并入那个远程分支。
#由于 git pull 的魔法经常令人困惑所以通常单独显式地使用 fetch 与 merge 命令会更好一些。
# 当你想要将 master 分支推送到 origin 服务器时(再次说明,克隆时通常会自动帮你设置好那两个名字),那么运行这个命令就可以将你所做的备份到服务器
git push origin master
# 查看某一个远程仓库的更多信息
git remote show origin
撤销
#to discard changes in working directory是一个危险的命令,你对那个文件做的任何修改都会消失.
git checkout -- <file>..."
# 恢复暂存区的指定文件到工作区
git checkout [file]
# 恢复某个commit的指定文件到暂存区和工作区
git checkout [commit] [file]
# 恢复暂存区的所有文件到工作区
git checkout .
# 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
git reset [file]
# 重置暂存区与工作区,与上一次commit保持一致
git reset --hard
# 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
git reset [commit]
# 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
git reset --hard [commit]
# 重置当前HEAD为指定commit,但保持暂存区和工作区不变
git reset --keep [commit]
# 新建一个commit,用来撤销指定commit
# 后者的所有变化都将被前者抵消,并且应用到当前分支
git revert [commit]
# 暂时将未提交的变化移除,稍后再移入
git stash
git stash pop
repo常用命令
repo init -u URL -b ........ # 创建.repo
repo upload # 将代码提交到gerrit.
repo abandon master # 放弃master分支
repo forall -c "git reset --hard HEAD" # 所有代码执行git命令,回退到HEAD
# repo sync相当于git clone会把repository中的所有内容拷贝到本地,非首次运行repo sync相当于更新和合并.
# repo sync会更新.repo下面的文件,如果在merge的过程中出现冲突,这需要手动运行git rebase --continue.
repo sync -c -j 4
repo start master --all # 创建新分支
Git-SVN常用命令
若服务器使用的 SVN,但是本地想要体验 Git 的本地分支,离线操作等功能,可以使用 Git-SVN功能。
# 下载一个 SVN 项目和它的整个代码历史,并初始化为 Git 代码库
$ git svn clone -s [repository]
# 查看当前版本库情况
$ git svn info
# 取回远程仓库所有分支的变化
$ git svn fetch
# 取回远程仓库当前分支的变化,并与本地分支变基合并
$ git svn rebase
# 上传当前分支的本地仓库到远程仓库
$ git svn dcommit
# 拉取新分支,并提交到远程仓库
$ svn copy [remote_branch] [new_remote_branch] -m [message]
# 创建远程分支对应的本地分支
$ git checkout -b [local_branch] [remote_branch]
其他帮助参考
repo 使用的更详细参考:
常用 Git 命令清单——阮一峰
Repo的理解及用法小结(1)
Repo的理解及用法小结(2)
repo
Git和Repo管理使用简要介绍
Git使用教程;
Git命令解析 - init、add、commit;
git使用的更详细参考: 可以百度“Pro Git 中文版”这个很不错的资料。
Pro Git(中文版);
当然,windows下不考虑逼格的话,还是用可视化界面吧,下载地址:git-gui ;
参考教程:
gitgui可视化工具的使用(超详细);
Git可视化教程——Git Gui的使用;
Git可视化极简易教程;
45个 GIT 操作场景;
另外可以利用工具自带的帮助功能查询常用命令:
repo
repo help
git help
git help [command]