文章目录
1对git的理解
例如我们每天要提交代码,那么每天都有相应的任务量,但是一个完整的项目需要好多人协同并且好多天才能完成,因此我们每个人不能等到自己的代码全部写完才传到代码仓库,因此要每天向仓库提交一定的代码,知道自己的任务完成.并且git还能知道你每次提交对原有的代码进行了那些修改,如果觉的自己更新的代码不如以前的代码git还可以回退到以前的代码.
在任意一个分支上面touch一个file文件,其他的分支上面都有这个文件,将文件git add file之后,每个分支上面还是有,但当在任意一个分支上面git commit之后,则只有那一个分支上面有文件file
---------------->这个特性造成文件的多人合作.一个文件需要不同的技术人员添加各自的模块,那么每个技术人员所处不同的分支,只需要在自己的分支上面编辑文件file,然后add添加到仓库中,最终当所有的人将模块都添加完成,此时就可以将内容merge合并提交到远程的master仓库
2申请github远程仓库
申请完成后,通常为了自己本机能够通过ssh访问远程仓库需要在远程仓库中添加自己主机的公钥。
2.1生成公钥
ssh-keygen命令,生成的公钥在目录/home/用户名/.ssh/下面,讲文件id_rsa.pub内容粘贴在SSH and GPG keys 选项栏
3.在本地创建版本库
3.1把目录变成可以管理的仓库
建一个空目录,执行git init会看到生成一个隐藏文件.git
3.2配置git
配置您的名字和邮箱,这里用户名
$ git config --global user.name “xxxxxxx”
$ git config --global user.email xxxxx@example.com
查看自己的配置信息
$git config --list
配置远程仓库的别名,这样在以后push推送的操作能简便些
$git remote add 自己起的别名 https://github.com/自己的github账号/自己分支名称
例如:git remote add Git_repository https://自己的github账号/自己仓库名称
配置好后可以查看自己远程仓库的信息
$git remote -vvv
Git_repository https://github.com/xxxxxxxxxx/Git_repository (fetch)
Git_repository https://github.com/xxxxxxxxxx/Git_repository (push)
2.彩色显示:
$git config --global color.ui auto
3.定义使用命令(如 git commit)时用到的文本编辑器
git config --golbal core.editor editor_name
git config --golbal core.editor vim
4.在 Windows 下使用 Git 时不让换行符 CRLF 替换 LF
git config --global core.autocrlf false
5.在 Windows 的 Git Bash 中让非 ASCII 字符的文件名正确显示
git config --global core.quotepath off
3.3添加文件到本地git仓库
git add file1
添加之后可以通过git status查看状态。
然后提交到本地仓库
$git commit -m “这里可以注明你提交的注释”
$git push origin master
将本地master分支推送到远程仓库origin
3.4在git仓库删除文件
git rm file1
git commit -m “delete file”
git push origin master
记得删除完后要重新push一下,不然仅仅是本地的file1删除了.远程仓库中还有file1文件
4远程仓库
可以在github上面注册.
4.1上传到远程库
查看已经存在的远程仓库,
git remote
如要查看远程仓库更加详细的信息
git remote -vvv
查看远程仓库分支信息
git remote show Git_repository,这里我的远程仓库的别名叫做Git_rewpository
显示如下:
远程 Git_repository
获取地址:https://github.com/xxxxxxxxx/Git_repository
推送地址:https://github.com/xxxxxxxxx/Git_repository
HEAD 分支:master
远程分支:
dev 已跟踪
master 已跟踪
mnt 已跟踪
mnt_test4 已跟踪
为 ‘git push’ 配置的本地引用:
dev 推送至 dev (最新)
master 推送至 master (最新)
mnt 推送至 mnt (最新)
mnt_test4 推送至 mnt_test4 (最新)
git push Git_repositoy master
推送本地master分支到远程Git_repository仓库的master分支相当于
git push Git_repositoy master:master
git push Git_repositoy dev
推送本地dev分支到远程dev分支
git push Git_repository dev:master
推送本地dev分支到远程master分支
如果本地仓库mnt分支与远程仓库Git_repository的mnt分支不一样,则会导致本地添加的新文件无法提交到远程仓库,因此需要获取远程仓库的最新版本并且合并到本地mnt分支,这样就可以提交本地mnt分支上面的新文件了
git pull Git_repository mnt
4.2更新同步远程仓库到本地
git pull Git_reposity master
git pull:相当于是从远程获取最新版本并merge到本地
上述命令其实相当于git fetch 和 git merge
在实际使用中,git fetch更安全一些
因为在merge前,我们可以查看更新情况,然后再决定是否合并
4.2从远程库克隆
git clone git@github.com:michaelliao/gitskills.gi
4.3删除远程仓库
git remote rm Git_repository
5创建和合并分支
git branch 查看所有分支
git checkout dev 创建分支dev
git merge dev 合并分支
git branch -d dev 删除分支dev
5.1合并分支的用途:
git checkout master
git merge mnt
通常自己的一个项目要一个星期才能完成,那么不想每天把没完成的项目推送到小组项目仓库master分支上,但是还想自己的队友知道自己的项目进行到什么地方,因此可以创建一个新的分支,mnt在这个分支写自己的项目,并且每天add,这样其他成员所处的分支也可以看见自己的项目,等项目全部完成就将mnt分支合并到master分支上面git merge mnt,然后git push master即可
5.2冲突解决
如果项目是多人合作有可能合并不了,会起冲突,例如dev分支的成员将file修改,并且git add; git commit而mnt分支的成员也将file修改并且git add ; git commit现在merge两个分支,
会出现如下错误:
自动合并 file
冲突(添加/添加):合并冲突于 file22
自动合并失败,修正冲突然后提交修正的结果
错误提示,因此要手动解决冲突
首先查看冲突git diff
1.修改的少可以直接在文件中改
2.修改的多,用mergetool工具
设置mergetool工具为vimdiff
Git config --global merge.tool vimdiff
查看所有设置
Git config --list
输入git mergetool进行文件修改
修改完成后git commit -m进行完成合并操作,然后push一下即可
6标签管理
git 的标签管理。跟大多数的 VCS 工具一样,git 也有在历史状态的关键点“贴标签”的功能,一般人们用这个功能来标记发布点(例如’v1.0′)
给某次提交打标签
git tag -a v0.1 -m “updata mnt”
查看所有标签
git tag
查看标签的详细信息
git show v0.1
后期打标签:
显示提交历史:
git log --pretty=oneline
给某次提交打标签
git tag -a v0.1 43045b(43045b是提交历史的编号)
推送标签到远程
git push Git_repository v0.1
默认情况下,git push 命令并不会传送标签到远程仓库服务器上。 在创建完标签后你必须显式地推送标签到共享服务器上。 所以git push origin [tagname]即可.
git push Git_repository --tags
一次性推送很多标签
通过自己的后续学习,补充后面的知识点
Git配置
- Git 命令补全
若使用的是 Bash shell, 可以在 Git 的源代码的 contrib/completion 目录下
(https://github.com/git/git/tree/master/contrib/completion),
可找到一个 git-completion.bash 文件, 将该文件保存为
~/.git-completion.bash, 再在 .bashrc 中加入如下一句即可:source ~/.git-completion.bash
Git 概念
- 工作目录 (Working directory)
- 暂存区 (Stage) / 索引 (Index)
- 版本库 (Repository)
工作目录 —(add)—> 暂存区 —(commit)—> 版本库 - HEAD 的含义:
HEAD : 最新一次的提交
HEAD^ : 上上次的提交(倒数第二次)
HEAD^^ 或 HEAD^2 : 上上上次的提交(倒数第三次)
- 远程仓库的名字默认为 origin (推荐使用该默认的名字)
git blame
- 查看某特定文件被谁在什么时候修改的历史信息
git blame <file_name>
git branch
- 查看所有分支信息:
git branch -a
- 查看各分支最后一次的提交信息:
git branch -v
- 查看已经合并的分支:
git branch --merge
- 查看尚未合并的分支:
git branch --no-merge
- 新建一个分支:
git branch <branch_name>
- 删除已被合并的分支(对未合并的分支会导致失败)
git branch -d <branch_name>
- 重命名分支:
git branch -m <old_branch_name> <new_branch_name>
git checkout
将工作目录的文件变为某个版本或分支的内容(称为"签出"或"检出")
- 签出某个文件: (跟 git reset 类似, 但会改变工作目录的内容)
git checkout <commit_id> <file_name>
(<commit_id> 为 HEAD 或 – 或留空时, 表示当前版本)
(<commit_id> 最好不要留空, 容易跟切换分支混淆)
- 更新工作目录的所有文件, 使其和某个特定提交中的文件一致
git checkout <commit_id>
- 切换到某个分支:
git checkout <branch_name>
git clean
- 执行一次 git clean 的"预演", 告诉哪些文件会被移除, 但不是真的移除:
git clean
- 移除当前目录未被跟踪的文件 (-f 参数时必需的):
(不会删除 .gitignore 中指定的未跟踪文件)git clean -f
- 移除某个路径下未跟踪的文件:
git clean -f <path_name>
- 移除当前目录下未跟踪的文件及目录:
git clean -df
- 移除当前目录下未跟踪的文件及 Git 一般忽略的文件:
git clean -xf
git clone
将 repo_url 指向的远程版本库克隆到本地:
(自动把远程仓库命名为 origin)
git clone <repo_url>
git commit
- 将暂存的文件提交(会要求添加注释)
git commit
- 将所有已跟踪的文件暂存并提交:
git commit -a
- 修改上次的提交, 把当前暂存的修改合并到上一次提交:
git commit --amend
- 直接填写注释 (message)
git commit -m “message”
- 在注释中添加一行 Signed-off-by 的信息
git commit -s
添加的 Signed-off-by 信息如下:
Signed-off-by: <user_name> <user_email>
git diff
查看文件的区别
-
比较工作目录和暂存区的文件:
git diff
-
比较工作目录和版本库的文件:
git diff HEAD
- 比较暂存区和版本库的文件:
git diff --cached
git 生成patch
git diff xxx-原有代码 xxx-新代码 > 1.patch
- 如果代码提交,则
git diff commit-id-原有提交 commit-id-新提交 > 1.patch
- 如果生成的patch有二进制文件,需要加上–binary
git diff commit-id-原有提交 commit-id-新提交 --binary > 1.patch
- git format-patch这种生成的补丁,能保存提交补丁的人,log信息等
- 最新一次提交的更改patch
git format-patch HEAD^
- 打上补丁
git apply 1.patch
git fetch
将提交从远程仓库导入到本地仓库, 拉取下来的提交存储为远程分支
- 拉取远程仓库的所有分支:
git fetch <remote_name>
- 拉取远程仓库的特定分支:
git fetch <remote_name> <branch_name>
- 可以将远程仓库的特定分支拉取到本地的特定分支
git fetch <remote_name> <remote_branch_name>:<local_branch_name>
git init
创建一个本地的库
git pull
- 拉取当前分支对应的远程副本的更改, 并立即并入本地副本
(效果与 git fetch 后接 git merge origin/. 一致)
git pull <remote_name>
- 可以使用 git rebase 而不是 git merge 合并远程分支和本地分支:
git pull --rebase <remote_name>
- 如果自己有已经commit的代码,但是gerrit上面没有合并,现在自己想拉取新的代码,则repo sync 这样自己的package仓库会出现偏离,则可以通过git pull --rebase来拉去最新代码,然后将自己的提交添加到最新代码的上面
git push
- 将本地指定的分支推送到远程仓库上:
git push <remote_name> <branch_name>
- 若想将指定的本地分支推送到指定的远程分支上, 可用:
git push <remote_name> <local_branch_name>:<remote_branch_name>
- 该语法的变种可用于删除某个远程分支:
git push <remote_name> :<remote_branch_name>
详情可参考:
[[%E5%88%A0%E9%99%A4%E8%BF%9C%E7%A8%8B%E4%BB%93%E5%BA%93%E7%9A%84%E6%9F%90%E6%AC%A1%E9%94%99%E8%AF%AF%E6%8F%90%E4%BA%A4][删除远程仓库的某次错误提交]]
- 若在第一次 push 时使用了 -u 参数, 以后就可以直接使用不带别的参数的 git pull 从之前 push 到的分支来 pull, 如:
git push -u origin master
- 将本地所有的分支推送到远程仓库上:
git push <remote_name> --all
- 标签不会被自动推送, 用 --tags 参数可将所有本地标签推送到远程仓库
git push <remote_name> --tags
git log
查看已提交的项目历史信息
- 使用默认格式显示完整的项目历史:
git log
- 除了 git log 的信息外还包括哪些文件被修改, 以及其相对的增删行数:
git log --stat
- 显示每个提交的一堆信息 (这是项目历史中最详细的视图):
- 如果代码已将git commit,这时想要看改动了代码的哪些地方,git log -p
git log -p <file_name>
- 搜索特定作者的提交 (pattern 可以是字符串或正则表达式):
git log --author=“pattern”
- 搜索提交信息匹配特定 pattern 的提交:
(pattern 可以是字符串或正则表达式)
git log --grep=“pattern”
- 只显示发生在 since 和 until 之间的提交:
(这两个参数可以是提交的 ID, 分支名, HEAD 或任何一种引用)
git log since…until
- 只显示包含特定文件的提交:
git log <file_name>
- 其他一些有用的选项:
git log --graph --decorate --oneline
–graph : 绘制一副字符组成的图形, 左边是提交, 右边是提交信息
–decorate : 加上提交所在的分支名称和标签
–oneline : 将每个提交信息压缩到一行
git merge
- 将特定分支合并到当前分支:
git merge <branch_name>
git mergetool
- 使用 merge 工具来解决冲突
(使用之前需要先配置 merge.tool)
git mv
- 用于移动或重命名文件
git mv <old_name> <new_name>
以上命令等价于:
mv <old_name> <new_name>
git rm <old_name>
git add <new_name>
git pack
(rebase 会用新的提交替换旧的提交, 因此不要在公共仓库上 rebase)
-
将当前分支 rebase 到 base_name 上:
(base_name 可以是任何类型的提交引用(ID, 分支名, 标签或 HEAD 等))git rebase <base_name>
-
中止 rebase:
git rebase --abort
-
在解决冲突后继续 rebase
git rebase --continue
git reflog
-
显示本地仓库的引用日志:
git reflog
-
用相对日期显示引用日志:
git reflog --relative-date
git remote
-
列出你和其他仓库之间的远程连接:
git remote
加上 -v 参数会同时显示每个连接的 URL
git remote -v
-
创建一个新的远程仓库连接:
git remote add <remote_name> <remote_url>
-
移除远程连接:
git remote rm <remote_name>
-
重命名远程连接:
git remote rename <old_name> <new_name>
git reset
(相比于 git revert, 它会改变现在的提交历史, 因此应该用在私有分支上, 在公共分支上尽量少用)
-
版本库恢复到某个特定的 commit
暂存区内容不保留
工作目录内容不变git reset --mixed <commit_id>
这是默认选项, 参数 --mixed 可省略:
git reset <commit_id>
该操作也可用于取消暂存某个文件:
git reset HEAD <file_name> -
版本库恢复到某个特定的 commit
暂存区内容保留
工作目录内容不变:git reset --soft <commit_id>
- 版本库恢复到某个特定的 commit
暂存区内容不保留
工作目录变为该 commit 的状态(未被跟踪的文件除外)
git reset --hard <commit_id>
以下命令相当于撤销工作目录最近修改的内容:
git reset --hard HEAD - 版本库恢复到某个特定的 commit
-
可对特定的文件进行操作:
git reset <commit_id> <file_name>
git revert
(相比于 git reset, 它不会改变现在的提交历史, 因此可以用在公共分支上)
创建一个新的提交来撤销某个提交:
git revert <commit_id>
(git revert 不会直接创建一个提交, 需要再执行 commit 命令才会成为真正的提交)
- 多条log提交,如果想撤销掉中间的某个log,
commit3
commit2
commit1
如上是git log显示的信息,想撤销commit2的代码git revert commit2
git rm
-
删除工作目录和版本库的文件(不会删除暂存区中的文件)
git rm <file_name>
-
删除暂存区和版本库的文件(不会删除工作目录的文件)
git rm --cached <file_name>
-
强制删除文件(包括工作目录, 暂存区, 版本库中的)
git rm -f <file_name>
(使用通配符时可能会有所受限, 可用 -rf 参数)
git stash
- 用于保存当前代码的修改状态. 适用于在某个分支上进行修改工作到一半时,
需要切换到其他分支处理一些紧急事情, 可将当前的工作状态存储起来:
或者下面的情况:- 正在干某件事情,没干完,不想进行一次commit,但是又需要拉取服务器最新的代码,可以使用git stash将正在进行的任务暂存起来
git stash
执行完后工作目录会变得干净, 从而可以随意切换分支
- git stash 可以执行多次, 通过以下命令可以查看所有 stash 的列表:
git stash list
可看到类似如下的信息:
stash@{0}: ...
stash@{1}: ...
.
.
.
其中 stash@{0} 为最近一次保存记录
-
为了方便记忆与辨识, 可以给记录命名:
git stash save “name”
再执行 git stash list 可看到类似如下的信息:
stash@{0}: ...
stash@{1}: ... : name
.
.
.
-
还原最近一次保存的记录:
git stash apply
也可以指定还原某一次保存的记录, 如:
git stash apply stash@{1}
若执行 git stash 时有部分文件已经加入了暂存区, 而有部分文件没有,
则执行 apply 操作后所有的文件都会变成未暂存的状态,
若想维持这些文件原本暂存的状态, 可加上 --index 参数:git stash apply --index
-
查看暂存的列表
>git stash list -
显示 stash 的内容具体是什么:
git stash show
与 git stash apply 一样可以指定某一次具体的 stash 记录, 如:
git stash show stash@{1}
-
执行 apply 操作后 stash 还在 stash 列表中, 若想删除这个 stash, 可用:
git stash drop
不加参数的话默认删除最新一条 stash 记录, 可以指定某一条具体记录, 如:
git stash drop stash@{1}
-
可用 pop 一次完成 apply 和 drop 的操作:
-
当完成别的任务后,使用git stash pop将暂存起来的任务恢复,继续做
git stash pop
-
存在一种情况, 我们把原来的状态 stash 了, 然后修改其他一些东西并提交了,
但这些修改的文件有些在之前已经被 stash 了, 执行 apply 时可能会有冲突.
这种情况可以在已经提交的基础上新建一个分支, 然后再执行 apply 操作.
这两个步骤可以用一次操作完成:git stash branch <branch_name>
暂存某次更改,且添加暂存标题XXX
git stash save “XXX”
git status
查看工作目录中未提交的文件的状态, 文件的状态可能为:
- Untracked (??)
- Added (A)
- Modified (M)
- Deleted (D)
- Renamed ®
git tag
-
为当前提交打标签:
git tag <tag_name>
-
为某个特定的提交打标签:
git tag <tag_name> <commit_id>
-
列出现有标签: (按字母排序)
git tag
(可另外使用 git show <tag_name> 查看标签的信息)
-
删除标签:
git tag -d <tag_name>
git rebase
如果git commit提交了多次代码,修改好多次提交的log信息
3.commit 0ee44efbb5bee04abc8116066764b1bdb9fac272 第三笔提交
2.commit 42fefcc6d87adedc50bfbe8b82faae81c520a1aa 第二笔提交
1.commit 4ef7d61c01f5c2e4ec550cda60e571882ab7cd91 第一笔提交
上面为最新提交
- 修改好多次提交的log信息
git rebase -i
修改上面提交前两次的log信息,执行git rebase -i 42fefcc6d87ade 会出现一个vim 编辑框,进入vim将pack改为r 并修改log信息,然后保存会自动跳转到第二个要修改的log信息的vim中。第一个vim修改的是第二笔提交,第二个vim 修改的是第三笔提交
-
通常在gerrit中把提交abandon,那么重新提交需要修改提交的id,才能重新推到gerrit上
-
如果现在最新提交一次代码是对第二笔提交的修改,只有将第二笔提交和第一笔提交换下位置,然后git commit --amend将最新的改动提交到原本第二笔提交上面。
-
撤销某次变基
git rebase --abort
git rebase -i执行错误导致处于正在变基中,若要撤销此次操作,git rebase --abort
Git commit 注释推荐规范
- 第一行为对改动的简要总结, 建议长度不超过 50, 用语采用命令式而非过去式
- 第二行为空行 (若配置了自动发邮件, 则第二行作为分隔线, 区分上下两部分)
- 第三行是对改动的详细介绍, 可以是多行内容, 建议每行长度不超过 72
(为的是 git log 输出的时候显示比较好看)
** Gitflow
[[file:…/.pictures/git-flow-commands-without-flow.png][git-flow-commands-without-flow.png]]
某些特殊的 Git 操作
删除远程仓库的某次错误提交
<<删除远程仓库的某次错误提交>>
参考:
http://zhiwei.li/text/2015/08/16/git%E5%A6%82%E4%BD%95%E5%88%A0%E9%99%A4%E8%BF%9C%E7%A8%8B%E4%BB%93%E5%BA%93%E7%9A%84%E6%9F%90%E6%AC%A1%E9%94%99%E8%AF%AF%E6%8F%90%E4%BA%A4/
(此处以远程仓库的 master 分支为例)
-
若远程仓库能通过 SSH 访问, 则跟本地操作没什么区别,
使用 git reset 相关命令即可 -
若远程仓库不能通过 SSH 访问, 则按照以下步骤操作:
- 在本地新建 old_master 分支作为备份, 以防万一
git branch old_master
- 将本地的 old_master 分支推送到远程的 old_master
git push origin old_master:old_master
- 在本地使用 git reset 的相关命令回退到某个特定的版本
- 删除远程的 master 分支
(如果是 Github 或 Bitbucket 等, 需要先把默认分支 (或叫做主要分支)
改为 old_master, 因为若默认分支为 master, 是不能删除的)git push origin :master
- 重新创建远程 master 分支
git push origin master:master
- 最后可以将默认分支改回为 master, 并删除本地和远程的 old_master 分支
- 在本地新建 old_master 分支作为备份, 以防万一
Repo
Ropo 可实现管理多个 Git 仓库
Repo 命令
参考链接:
- http://blog.csdn.net/stevenhu_223/article/details/8828130
- http://www.cnblogs.com/angeldevil/p/3238470.html
- https://source.android.com/source/using-repo?hl=zh-cn#top_of_page
- 可以使用 repo 内部的帮助来查阅命令的用法:
repo help
如:
repo help init
注意:
对于除 init 外的所有 repo 命令,
当前目录必须是 .repo 的父目录或对应父目录的子目录
repo abandon
- 删除一个分支, 无论是否已经 merge
(实际上是对 git branch -D <branch_name> 的封装)
repo abandon <branch_name> […]
repo branch
- 查看分支
repo branch [<project_name>…]
repo diff
- 查看在 commit 与 working tree 之间的文件差异
repo diff [<project_name>…]
repo init
repo init -u [OPTIONS]
在当前目录下初始化 repo, 在当前目录下生成一个 .repo 目录
- -u 参数指定远程库的 URL
- 可以加上 -m 参数指定 manifest 文件, 默认为 default.xml,
在 .repo/manifest 里保存 manifest 文件.
repo 是一系列 git project 的集合, 在 .repo/projects 下有所有
git project 的数据信息, 每个 git project 下 .git 目录中的
refs 等目录都链接到 .repo/manifest 下. - 可以加上 -b 参数指定某一个分支
例子:
repo init -u http://gerrit.allwinnertech.com:8081/product/tina/manifest.git -b tina-dev -m default.xml
repo manifest
- 显示 manifest.xml 文件的内容
repo manifest
repo prune
- 删除已经 merge 的分支
repo prune [<project_name>…]
repo start
repo start <branch_name> [-all | <project_name>…]
从远程库同步下来的新git仓库是没有分支的,git branch -vvv 查看分支情况,显示该仓库(非分支)将新git 仓库对应的本地仓库名称为name-dev
repo start name-dev 新git仓库
.repo/manifests/default.xml文件里面保存所有仓库是通过哪个远程仓库拉下来的,并且提交代码到哪个远程仓库,以及本地仓库名称对应的远程哪个仓库名称,如果新添加一个仓库,可以更改这个文件,但是新添加的仓库需要给这个仓库对应一个本地仓库的名称,否则repo forall -p -c git branch -vvv这样会显示新添加的仓库(非分支)
刚克隆下来的代码是没有分支的, repo start 实际是对 git checkout -b
命令的封装, 为指定的项目或所有项目 (若使用 --all 参数),
以 manifest 文件中设定的分支为基础, 创建特性分支.
区别于在当前分支基础上创建分支的 git checkout -b,
repo start 是在 manifest 文件设定分支的基础上创建特性分支
例子:
repo start tina-dev --all
repo status
- 查看本地所有或指定某些 project 的修改, 每个修改的文件前有两个字符.
repo status [<project_name>…] - 第一个字符表示暂存区的状态:
Letter | Meaning | Description |
---|---|---|
- | no changed | same in HEAD and index |
A | added | not in HEAD, in index |
M | modified | in HEAD, modified in index |
D | deleted | in HEAD, not in index |
R | renamed | not in HEAD, path changd in index |
C | copied | not in HEAD, copied from another in index |
T | mode changed | same content in HEAD and index, mode changed |
U | unmerged | conflict between HEAD and index, resolution required |
- 第二个字符表示工作区的状态:
Letter Meaning Description - new/unknown not in index, in work tree m modified in index, in work tree, modified d deleted in index, not in work tree
repo sync
- 参照 manifest 文件 .repo/manifest.xml 克隆并同步版本库.
repo sync [<project_name>…]
repo upload
- 将版本库推送到 Gerrit 代码审核服务器
repo upload [–re --cc] [<project_name>…]
如果repo upload提交两个仓库的内容,那么分别在各自的仓库中进行git commit后,repo upload,然后出现一个vim编辑框,此时将要提交的不同仓库解注释,即可实现多仓库提交
选项如下:
- -t : 发送本地分支名到 Gerrit 代码审核服务器
- --re=REVIEWERS, --reviewers=REVIEWERS : 请求指定人员进行审核
- --cc=CC : 同时给指定的邮件地址发送邮件
- --br=BRANCH : 指定 upload 的分支
- --cbr, --current-branch : upload 当前的分支
- -d, --draft : 作为一个 draft 进行 upload
- -D BRANCH, --destination=BRANCH, --dest=BRANCH :
为指定的这个分支提交 review
- --no-verify : 不要运行 upload hook
- --verify : 运行 upload hook 而不提示
- 删除本地分支
git branch -D Su-modify
- 删除a目录下的2.txt文件 删除a目录git rm -r --cached a
git rm -r --cached a/2.txt
repo forall
- 切换所有git仓库分支
repo forall -c git checkout tina-v2.5.0
- 创建并切换所有git仓库分支
repo forall -c git checkout -b tina-v3.0.6 tina-v3.0.6
- 清空所有分支的修改
repo forall -c git checkout .
- 查看所有仓库的远程分支名称
repo forall -p -c git branch -vvv
- 当提交的代码在远程分支没有合并之前,在本地git status时,提示跟远程分支偏离,
因此,如果此时git reset 到一个版本,然后git pull拉取最新代码,然后git status出现没有跟踪当前提交的文件。出现这样的情况,可以在gerrit中找到自己以前提交的changed ID然后git add ,git commit -s 将这个id粘贴到上面,最后再repo upload即可