Antkillerfarm Hacking V7.5

toolchain » Git(二)

2018-02-21 :: 6539 Words

Git

git常用命令

GUI工具

  • gitk:主要用于展示分支树。

安装:

sudo apt install gitk

运行:

gitk:展示当前分支

gitk --all:展示所有分支。

gitk v1.0:展示特定分支。

  • git-gui:主要用于提交文件。

安装:

sudo apt install git-gui

运行:

git gui

以上两个工具采用tk/tcl编写,都是全平台支持的。

这两个工具的作者虽然不同,但是都在自己软件中,留下了打开对方软件的快捷方式,真可谓狼狈为奸?

  • tig:一个字符式的图形界面工具。类似的还有Lazygit和gitui。

https://zhuanlan.zhihu.com/p/601987272

有了这款开源神器,Git容易多了!(git-sim)

创建版本库

git init

Git常用的撤销操作

基本状态标识

  • A- = untracked 未跟踪
  • A = tracked 已跟踪未修改
  • A+ = modified - 已修改未暂存
  • B = staged - 已暂存未提交
  • C = committed - 已提交未PUSH

各状态之间变化

  • A- -> B : git add <FILE>
  • B -> A : git restore <FILE>
  • B -> A- : git rm --cached <FILE>
  • B -> 删除不保留文件 : git rm -f <FILE>
  • A -> A- : git rm --cached <FILE>
  • A -> A+ : 修改文件
  • A+ -> A : git checkout -- <FILE>
  • A+ -> B : git add <FILE>
  • B -> A+ : git reset HEAD <FILE>
  • B -> C : git commit
  • C -> B : git reset --soft HEAD^
  • 修改最后一次提交: git commit --amend
  • 只修改内容,不改msg: git commit --amend --no-edit
  • 修改最后一次提交的author: git commit --amend --reset-author 这里直接用当前author信息替换之,所以需要在修改前,设置好author信息

暂存本地修改及恢复

如果git pull的时候,本地有修改,就需要暂存,并在git pull之后,恢复之。

git stash

git stash pop

回退和前进

回退历史版本:

git checkout

回退之后,如果不满意,就需要前进操作,以恢复后续的更新。然而这个时候有个麻烦的地方,在git log中已经找不到后续的更新记录,也就查不到commit id。这时可以用git reflog查看git操作记录,以获得想要的commit id,并checkout之。

远程操作

查看远程仓库的地址:

有的时候时间一长,就会搞忘当初下载代码时的远程仓库的地址。这时可以使用git remote -v查看之。

查看远程分支:

git branch -r

checkout远程分支:

git checkout -b dev origin/dev

push远程分支:

git push <远程主机名> <本地分支名>:<远程分支名>

删除远程分支:

git push origin --delete dev_2

同步已经删除的远程分支:

git remote prune origin

check out有submodule的版本库

git clone --recursive URL

checkout和reset的区别

https://segmentfault.com/a/1190000006185954

git的reset和checkout的区别

制作和应用patch

制作patch主要有两种方式:git diffgit format-patch。前者生成通用patch,而后者生成git专用patch。使用示例:

git diff SHA1 SHA2 比较两个历史版本之间的差异,SHA1和SHA2是两次commit的SHA值。

git format-patch HEAD^

git format-patch -1

应用patch:git amgit apply

git apply并不会将commit message等打上去,打完patch后需要重新git addgit commit,而git am会直接将patch的所有信息打上去。

使用tag

打标签:

git tag -a v0.1.2 -m "v0.1.2"

列出标签:

git tag

检出标签:

git checkout v0.1.2

强制更新

当发生冲突,需要放弃修改,强制更新的时候,可以:

本地版本:

git reset --hard

远程版本:

git reset --hard origin/<branch name>

保存密码

编辑仓库目录中本地的”.git/config”文件,增加如下属性:

[credential]
    helper = store

使用密码

git clone https://<USERNAME>:<PASSWORD>@github.com/path/to/repo1.git

cherry-pick

用于将分支A上的修改C,移植到分支B上。

git cherry-pick <commit id>

撤销已经push的内容

git reset --soft <SHA>

git push origin master --force

Other

git blame查看一行代码是谁改的。

HEAD表示当前版本,HEAD^^表示当前版本之前的两个版本,如果回溯的版本较多也可以写作HEAD~100

git merge -s ours branch,在不改变本地内容的情况下,触发merge操作。

git log --graph,字符式的图形化展示分支历史。

远端仓库

查看远程仓库地址:

git remote -v

修改远程仓库地址:

git remote set-url origin URL

Github进行fork后如何与原仓库同步:

  • 添加主repo的源:

git remote add upstream URL

  • 与主repo同步:

git fetch upstream

git merge upstream/master

git push

解决server certificate verification failed问题:

git config --global http.sslverify false

.gitignore

有的文件或文件夹,你不想将它加入版本控制中,但恼人的是,每次commit的时候,这些文件都会出现在候选列表中,稍有不慎,甚至会错误选中。

这时,你可以编辑.gitignore来忽略这些文件,相当于是加了一个黑名单。但其实.gitignore也可定义白名单:

*/
!src/
!src/**

参考:

http://ybin.cc/git/gitignore-syntax/

彻底理解.gitignore

https://github.com/github/gitignore

包含各种常见开发环境的.gitignore示例

LF与CRLF转换

#提交时转换为LF,检出时转换为CRLF
git config --global core.autocrlf true

#提交时转换为LF,检出时不转换
git config --global core.autocrlf input

#提交检出均不转换
git config --global core.autocrlf false

#拒绝提交包含混合换行符的文件
git config --global core.safecrlf true

#允许提交包含混合换行符的文件
git config --global core.safecrlf false

#提交包含混合换行符的文件时给出警告
git config --global core.safecrlf warn

参考:

http://www.cnblogs.com/sdgf/p/6237847.html

git换行符LF与CRLF转换问题

修改用户名

git config user.name XXX

git config user.email XXX@YYY

全局配置放在~/.gitconfig,单个仓库的配置放在.git/config

下载单个文件夹

使用Git拉去github上的一些开源项目,无比方便,但是有些项目比较庞大,而我们只想拉取其中指定的一部分文件夹或者文件,那就需要我们另外动些手脚了。

1.使用SVN。

需要修改URL:

https://github.com/Sarasra/models/tree/master/research/capsules

/tree/master/换成/trunk/即可。

2.使用Sparse checkout。

git init
git remote add -f origin <url>
git config core.sparsecheckout true
echo “libs” >> .git/info/sparse-checkout

参考:

https://blog.csdn.net/deeplies/article/details/52754980

如何在github上下载单个文件夹?

https://www.zhihu.com/question/25369412

如何从GitHub上下载单个文件夹?

自动补全

git项目下有个git-completion.bash文件,提供了tab自动补全的功能。

https://www.cnblogs.com/wang_yb/p/5969451.html

命令行自动补全原理

缺点

git对于大的二进制文件不太友好,对于文件/历史的部分导出也支持的不太好。所以对于大公司的项目来说,并不太好用。

目前的公司使用Perforce作为版本控制工具,和git相比这种老工具的功能实在是弱爆了。但是P4对于大文件支持的很好,所以还是不得不用。

参考:

http://www.ruanyifeng.com/blog/2016/07/google-monolithic-source-repository.html

谷歌的代码管理

https://www.zhihu.com/answer/175222330

代码版本控制用SVN还是Git好?

OpenGrok

OpenGrok是一个阅读源码的Web系统。

官网:

http://oracle.github.io/opengrok/

代码:

https://github.com/oracle/opengrok

参考:

http://mazhuang.org/2016/12/14/rtfsc-with-opengrok/

搭建大型源码阅读环境——使用OpenGrok

Git LFS

Git LFS(Large File Storage)是Github开发的一个Git的扩展,用于实现Git对大文件的支持。

Git LFS可以把音乐、图片、视频等指定的任意文件存在Git仓库之外,而在Git仓库中用一个占用空间1KB不到的文本指针来代替文件的存在。

通过把大文件存储在Git仓库之外,可以减小Git仓库本身的体积,使克隆Git仓库的速度加快,也使得Git不会因为仓库中充满大文件而损失性能。

官网:

https://git-lfs.github.com

中文简介:

https://gitee.com/help/articles/4235

安装:

curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
sudo apt install git-lfs
git lfs install

没有带宽问题的话,可以直接git lfs fetch --all。但是考虑到国内的访问速度,最好还是指定单个文件,逐个下载比较好。

白名单:

git config lfs.fetchinclude '<file path>'

黑名单:

git config lfs.fetchexclude '<file path>'

然后:

git lfs fetch --recent

gitee由于将LFS当作收费功能,竟然丧心病狂的将黑名单设为*,导致fetch不到任何东西。。。

最后:

git lfs checkout

使用中遇到问题,可以查询设置:

git lfs env

列出repo里所有lfs文件:

git lfs ls-files

参考:

https://mp.weixin.qq.com/s/yoSeUTy13LoKyS1UFKaUbA

如何存储Git大文件?

参考

https://mp.weixin.qq.com/s/z_zFveiiLu9vLvWuBcsaIg

Git从入门到进阶

https://mp.weixin.qq.com/s/0Cv968LpSSYKJpAbW1MlMA

手把手教你git全操作

https://mp.weixin.qq.com/s/DbvRbaH7BJKeTCT4LVXUoA

Git的4个阶段的撤销更改

https://mp.weixin.qq.com/s/nUqvSnnPjYqk2O8u0tQEtQ

Git内部原理揭秘

https://mp.weixin.qq.com/s/nmi1HYkKD8QX0phbvOko2Q

Git居然还有这么高级用法,你一定需要

https://mp.weixin.qq.com/s/PUUL913fig6cFfqy4OKcGA

工作流一目了然,看小姐姐用动图展示10大Git命令

https://blog.csdn.net/mocoe/article/details/84344411

修改git commit的author信息

https://mp.weixin.qq.com/s/9Ey04P5Xv4W95N2FEioZ1g

如何选择Git分支模式?

https://mp.weixin.qq.com/s/GZkGfwrfMTzrMfki8LKbIw

腾讯广告3000+万行大代码库主干开发实战

https://mp.weixin.qq.com/s/KEu6qCl-En6HiKGo2pgEQg

TensorBay:一款易用的像Git一样数据版本管理工具!

Fork me on GitHub