文章目录
git
-
Workspace:工作区
-
Index / Stage:暂存区
-
Repository:仓库区(或本地仓库)
-
Remote:远程仓库
git branch -vv
git rebase
git push
VS code 插件
- gitlens 可以实时看每行、每个文件是谁修改的。可以根据commit 哈希值来查找对应,显示效果也很棒
- 配置
git config --global core.editor "code --wait"
可以图形化处理冲突、处理rebase
- 配置
- Git History:图形化很棒,可以选择两个commit来比?
- clang-format 可以按照Google 格式 格式化自己的代码,更好看更标准了
- Remote - SSH、Remote Development 远程开发利器
提取远程仓库
-
git pull 其实就是 git fetch 和 git merge FETCH_HEAD 的简写
git pull origin master:brantest
:将远程主机 origin 的 master 分支拉取过来,与本地的 brantest 分支合并。
-
git fetch [alias]
告诉 Git 去获取它有你没有的数据;(更新本地的远程分支) -
执行
git merge [alias]/[branch]
以将服务器上的任何更新(假设有人这时候推送到服务器了)合并到你的当前分支。
// 获取服务器最新数据
git fetch origin
// 将其合并到当前分支
git merge origin/master
- git fetch更新本地仓库的两种用法:
# 方法一
$ git fetch origin master #从远程的origin仓库的master分支下载代码到本地的origin maste
$ git log -p master.. origin/master #比较本地的仓库和远程参考的区别
$ git merge origin/master #把远程下载下来的代码合并到本地仓库,远程的和本地的合并
# 方法二
$ git fetch origin master:temp #从远程的origin仓库的master分支下载到本地并新建一个分支temp
$ git diff temp #比较master分支和temp分支的不同
$ git merge temp #合并temp分支到master分支
$ git branch -d temp #删除temp
https://www.runoob.com/git/git-remote-repo.html
- 执行 git fetch origin master 时,它的意思是从名为 origin 的远程上拉取名为 master 的分支到本地分支 origin/master 中。既然是拉取代码,当然需要同时指定远程名与分支名,所以分开写。
- 执行 git merge origin/master 时,它的意思是合并名为 origin/master 的分支到当前所在分支。既然是分支的合并,当然就与远程名没有直接的关系,所以没有出现远程名。需要指定的是被合并的分支。
- 执行 git push origin master 时,它的意思是推送本地的 master 分支到远程 origin,涉及到远程以及分支,得分开写了
推送到远程仓库
git push [alias] [branch]
- add: 内容写进暂存区
- commit: 暂存区内容添加到本地仓库
- push:将本地的分支版本上传到远程并合并。
//git add
git add . //目录下所有文件
git add readme.md
// 然后可以更新远端,再查看远端和本地的区别
git fetch origin
git diff HEAD FETCH_HEAD
//git commit
git commit -m 'update readme'
//push 远程仓库
git push origin master
//或者 :将本地masterA推送到远端masterB
git push origin masterA:masterB
合并push 了的commit(合并commit)
git log
git rebase -i HEAD~3
最近三个(看自己最近几个- 或者
git rebase -i origin/master
rebase 到master (处理完冲突就push就好,有可能要push -f)
- 或者
git push -f origin local:master
之前push 过的commit ,rebase 后需要 push force
还没push的commit
- 可以直接
git reset --soft HEAD~1
恢复1个commit回来,然后合成一个commit 提交
参数
git remote
-v
参数(verbose),你还可以看到每个别名的实际链接地址。
git reset [--soft | --mixed | --hard] [HEAD]
回退版本
add && commit && push
$ git add --all # 当前项目下的所有更改
$ git add . # 当前目录下的所有更改
$ git add xx/xx.py xx/xx2.py # 添加某几个文件
第三步:git commit,变为已提交状态
git commit -m"<这里写commit的描述>"
git commit --amend -m #使用一次新的commit,替代上一次提交
第四步:git push,变为已推送状态
$ git push -u origin master # 第一次需要关联上
$ git push # 之后再推送就不用指明应该推送的远程分支了
$ git branch # 可以查看本地仓库的分支
- git diff检查的是工作区与暂存区之间的差异。
$ git diff # 列出所有的修改
$ git diff xx/xx.py xx/xx2.py # 列出某(几)个文件的修改
refs
Git Reference简写为refs
Reference Specification简称refspec
- 本地分支 的Reference格式:refs/heads/<local_branch_name>
- 如refs/heads/master,在保证唯一的情况下可以简写为
master
- 如refs/heads/master,在保证唯一的情况下可以简写为
- 远程追踪分支 的Reference格式:refs/remotes/<remote_repository>/<remote_branch_name>
- 如refs/remotes/origin/master,在保证唯一的情况下可以简写为
origin/master
- 如refs/remotes/origin/master,在保证唯一的情况下可以简写为
- tag 的Reference格式:refs/tags/<tag_name>
- 如refs/tags/v1.0.1,在保证唯一的情况下可以简写为
v1.0.1
- 如refs/tags/v1.0.1,在保证唯一的情况下可以简写为
一些Git保留使用的特殊refs:
HEAD
,指向当前本地分支的当前commit状态FETCH_HEAD
,指向当前本地分支在最近一次fetch操作时得到的commit状态ORIG_HEAD
,指向任何merge或rebase之前的刚刚检出时的commit状态
branch
git branch //查看本地所有分支
git branch -r //查看远程所有分支
git branch -a //查看本地和远程的所有分支
git branch <branchname> //新建分支
git branch -d <branchname> //删除本地分支
git branch -d -r <branchname> //删除远程分支,删除后还需推送到服务器
git push origin:<branchname> //删除后推送至服务器
git branch -m <oldbranch> <newbranch> //重命名本地分支
git branch -vv // 查看本地分支关联(跟踪)的远程分支之间的对应关系
git branch --set-upstream-to=origin/master-remote master-local //将本地分支和远端分支建立关联 or 建立新的连接
远端建立、断开链接、查看远端 url
- git remote remove origin 断开链接
- git remote add origin “url” 与“url” 建立连接
- git branch --set-upstream-to=origin/master-remote master-local //将本地分支和远端分支建立关联 or 建立新的连接
- git remote -v 查看远端
checkout
git checkout <branch、commit、tag>
切换到对应分支、commit、tag- 直接切换分支,会处于
detached HEAD
状态,这时候tag 相当于快照,无法修改代码。
- 直接切换分支,会处于
git checkout -b branch_name tag_name
根据tag 创建新分支并立即切换到该分支下
log
//每次提交的简略统计信息
git log --stat
tag
-
git tag -l | xargs git tag -d
#删除所有本地分支 -
git fetch origin --prune
#从远程拉取所有信息 -
git ls-remote --tags origin
#查询远程tags的命令如下:
tag常用git命令:
git tag
#列出所有taggit tag -l v1.*
#列出符合条件的tag(筛选作用)
git tag
#创建轻量tag(无-m标注信息)git tag -a -m ‘first version’
#创建含标注taggit tag -a f1bb97a(commit id)
#为之前提交打taggit push origin --tags
#推送所有本地tag到远程
git push origin
#推送指定本地tag到远程git tag -d
#删除本地指定taggit push origin :refs/tags/
#删除远程指定taggit fetch origin
#拉取远程指定taggit show
#显示指定tag详细信息
patch
git diff > ***.patch
生成patchgit apply *.patch
打patchgit apply -R *.patch
回退patch
stash & status
经常一起用
git status
git stash
将新的贮藏推送到栈上git stash pop
重新应用 & 移除git stash apply
重新应用git stash drop
移除
git stash list
git status -s
reset
git reset HEAD^ main.cc
回退 main.cc文件的版本到上一个版本git reset HEAD^
回退所有内容到上一个版本git reset HEAD^3
回退所有内容到上三个版本- 默认的参数是
--mixed
重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变。(即,现在改的,之前commit 的都到暂存区) --soft
修改版本库,保留暂存区,保留工作区(即,现在改的不变,之前commit 的都到staged)--hard
参数撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交- 谨慎使用 –hard 参数,它会删除回退点之前的所有信息。
- 默认的参数是
cherry-pick
- 已经提交的commit, 从一个分支放到另一个分支
git cherry-pick <commit id>
- 切换到需要这个commit 的分支,然后执行,这个commit 就会加到当前分支的commit 中
本地仓 clone 、复制一份本地仓库
git clone <source> <dir>
拷贝source 到 dir, dir是不存在的目录,拷贝时自动创建的。
gclient
- 跨平台的代码仓库管理工具,用于管理由多个代码仓库组成的项目;
- 核心功能是根据一个Solution的DEPS文件所定义的规则将多个git仓库拉取到指定目录。例如,chromium就是由80多个独立仓库组成。
Using depot_tools
https://keyou.github.io/blog/2017/11/02/gclient/
-
gclient sync
该命令用来同步solution- 所依赖的是根目录下的
DEPS
文件,记录了依赖url 等。
- 所依赖的是根目录下的
-
Hooks
: gclient中的术语,当gclient拉完代码之后执行的额外脚本;- What does “gclient runhooks” do? :处理DEPS文件中配置的钩子
- 这些钩子可以是各种被执行的脚本,但主要是下载额外的资源并使用GYP生成项目。 GYP
- What does “gclient runhooks” do? :处理DEPS文件中配置的钩子