基本命令

git init
创建一个空的repo或重新初始化现有的repo。会在当前目录下创建一个.git的隐藏文件夹,里面有objects, refs/heads, refs/tags和一些模板文件。
git status
显示工作目录的状态
git add -A
添加工作目录中的所有文件
git commit -m “offical linux kernel 5.4.7”
提交修改,-m后加comment
git push
将本地改动推到服务器
git clone -b emcraft https://github.com/EmcraftSystems/linux-upstream.git —depth=1
只拉取某一分支的代码,-b指定分支,—depth指定深度,=1意思是只包含最后一次commit的信息
git pull
从服务器端取最新文件同步到本地,本质是git fetch和git merge FETCH_HEAD的组合。
git log filename
可以看到fileName相关的commit记录
git log -p filename
可以显示每次提交的diff
git show commit-id filename
只看某次提交中的某个文件变化,可以直接加上fileName
git rm -f

删除文件
git branch
显示所有本地branch,加星号的表示当前branch
git branch -r
列出服务器端所有branch
git branch -a
列出本地和服务器端所有branch
git branch -v
显示每个branch的sha1,提交时的comment,以及和upstream的关系。
git branch —set-upstream-to=origin/lavender-p-oss lavender-p-oss
给本地branch设置upstream的branch
git branch -d
删除本地branch
将iss53分支merge到master分支,先切换到master分支,然后执行如下merge命令。

  1. $ git checkout master
  2. Switched to branch 'master'
  3. $ git merge iss53
  4. Merge made by the 'recursive' strategy.
  5. index.html | 1 +
  6. 1 file changed, 1 insertion(+)

git merge —abort
merge完后想取消merge
git checkout FILE —ours{—theirs}
merge完有冲突,选择使用当前分支还是合入的分支。然后add后再commit

  1. $ git merge B #试图将B分支合并到A分支上,会提示test.docx合并冲突
  2. $ git checkout test.docx --ours #保留A分支(当前分支)上的改动
  3. $ git add test.docx #提交改动后的文件
  4. $ git commit -m "解决了test.docx上的冲突,保留了A分支改动"

git tag -l
列出本地tag
git tag -d
删除本地tag
git tag v1.0
给当前commit打tag
git push —tags
将本地tag推送到远端服务器
git checkout

显示工作区,暂存区和HEAD的差异
git checkout
切换到某个branch
git checkout -b
创建并切换到本地branch
git checkout
从index里重新检出文件覆盖本地工作目录的文件
git remote add origin https://github.com/offensive-security/kali-nethunter.git
关联远程repo为origin
git remote -v
查看远程repo信息
git fetch origin —depth=1
将远程repo拉到本地,—depth指倒数第几次commit
git stash
将本地的更改保存起来,然后切换到一个干净的工作环境。
git stash list
列出之前保存的状态
git stash pop
将之前保存的状态应用到当前工作目录
git clean -f -d
从工作目录删除所有untracked的文件。-f表示强制删除,-d表示也删除文件夹。
git reset —hard
重置工作目录,任何改动都被丢弃。
git gc —prune=now
清理本地repo
git config —global user.name “John Doe”
设置用户名
git config —global user.email johndoe@example.com
设置邮箱地址
git config —global core.editor emacs
设置默认编辑器
git config —global core.autocrlf true
如果是在Windows系统上,把它设置成true,这样当签出代码时,LF会被转换成CRLF。
git config —global core.autocrlf input
当一个以CRLF为行结束符的文件不小心被引入时你肯定想进行修正,把core.autocrlf设置成input来告诉 Git 在提交时把CRLF转换成LF,签出时不转换
git config core.filemode false
在windows下clone下来的文件权限可能被修改了,因为Windows不支持Linux的filemode。将core.filemode设成false可以忽略文件权限。
git diff branch1 branch2 —stat //显示出所有有差异的文件列表
git diff branch1 branch2 文件名(带路径) //显示指定文件的详细差异
git diff branch1 branch2 //显示出所有有差异的文件的详细差异
git diff —color > foo.diff
foo.diff用notepad++/sublime 之类的编辑器打开,高亮颜色
git diff HEAD^ — file //当前file和提交的前一个版本比较

submodule

$ git submodule add git://github.com/chneukirchen/rack.git rack
$ git commit -m ‘first commit with submodule rack’
简单概括一下:
如果克隆库的时候要初始化子模块,请加上 —recursive 参数,如:
git clone —recursive git@github.com:rbind/yihui.git
如果已经克隆了主库但没初始化子模块,则用:
git submodule update —init —recursive
如果已经克隆并初始化子模块,而需要从子模块的源更新这个子模块,则:
git submodule update —recursive —remote
更新之后主库的 git 差异中会显示新的 SHA 码,把这个差异选中提交即可。
如果要向一个库中添加一个新的子模块,可以用 git submodule add,例如把我的 Github 账户下的一个库添加到 themes/hugo-lithium-theme 文件夹中:
git submodule add https://github.com/yihui/hugo-lithium-theme.git themes/hugo-lithium-theme

add submodule and define the master branch as the one you want to track
git submodule add -b master [URL to Git repo] git submodule init

Delete a submodule from a repository
Currently Git provides no standard interface to delete a submodule. To remove a submodule called mymodule you need to:
git submodule deinit -f mymodule
rm -rf .git/modules/mymodule
git rm -f mymodule

detached HEAD

如果让HEAD文件指向一个commit id,那就变成了detached HEAD。git checkout 可以达到这个效果,用下面的命令:
git checkout 1aea8d9^
laea8d9是最近的一次commit id,^指的是之前一次,因此上面的操作结果是让HEAD文件包含了倒数第二次提交的id.
想重新attach到某个branch上可以用checkout命令:
git checkout

Your branch and ‘origin/xxx’ have diverged

本地的branch和服务器端的分叉了。解决办法:
git fetch origin
git reset —hard origin/xxx

git clone慢的解决方案

修改host文件

思路:git clone 特别慢是因为github.global.ssl.fastly.Net域名被限制了。只要找到这个域名对应的ip地址,然后在hosts文件中加上ip–>域名的映射,刷新DNS缓存就可以了
步骤:
1、查询域名global-ssl.fastly.Net和 github.com 公网地址。可以用https://www.ipaddress.com/查。
分别查找github.global.ssl.fastly.net和github.com这两个网址的ip地址。
2、将ip地址添加到hosts文件
sudo gedit /etc/hosts
保存退出
3、修改完hosts还不会立即生效,你需要刷新DNS缓存,告诉电脑我的hosts文件已经修改了。
输入指令:sudo systemctl restart NetworkManager.service 即可。

使用depth参数

clone git的项目的时候,经常都会遇到项目很大,提交历史很长,导致clone的时候花大半天都clone不下来的问题。而且如果直接git clone,必须一次把所有的历史clone下来,否则失败就直接丢弃所有。如果只是需要最新内容,或者网络不好,总是网络中断的情况,非常不友好。
git clone 的 depth 参数
实际上,如果只需要看最新的提交,使用depth参数,就可以实现只clone最新的代码:
git clone —depth 1 $clone_url
当然,还能使用 —single-branch 参数,指定对应分支。
这个clone出来的结果,就是一个shadow,只有部分提交的git repo
git fetch 与 depth参数
在使用depth 1参数把最后一个提交clone出来之后,如何一步步获取历史提交呢?既然有只含有部分commit的shadow,就肯定有办法把这个shadow扩展为完整repo的指令,这个指令就是fetch。例如,之前已经clone了depth为1的commit,剩下的就是逐步fetch剩下的commit了。
git fetch —depth $depth
depth为1,表示从最新的提交开始,往下获取1个commit(也就是那个最新的commit)
depth为2,表示从最新的提交开始,往下获取2个commit(最新的commit加一个第二新的commit)
以此类推。
但用depth 1拉下来的只是默认的分支,而要想拉取其他分支代码的时候就会报错,解决办法如下。

  1. $ git remote set-branches origin 'remote_branch_name'
  2. $ git fetch --depth 1 origin remote_branch_name
  3. $ git checkout remote_branch_name

或者
git pull —unshallow
git fetch —unshallow

使用proxy

开启:
git config —global http.proxy $server:$port
git config —global https.proxy $server:$port
关闭:
git config —global —unset https.proxy
git config —global —unset http.proxy
关闭SSL CERT verification:
git config —global http.sslVerify false
启用默认的SSL CERT verification:
git config —global —unset http.sslVerify

断点续传

git clone总是出错那么:
1).建立repo的本地存储目录
2).进入目录执行 git init生成.git索引文件夹
3).继续执行 git fetch GIT_REPO_URL, 如果掉线,可继续重复执行该命令知道看到如下标志表示fetch成功:
From GIT_REPO_URL
*branch HEAD -> FETCH_HEAD
4). 执行 git checkout FETCH_HEAD
5). OK clone Head成功

中间可能碰到权限问题,需要去git上增加一个ssh的key
“Please make sure you have the correct access rights and the repository exists.”
命令行执行以下语句
git config —global user.name 【你的登录用户】
git config —global user.email 【你的注册邮箱】
ssh-keygen -t rsa -C “your@email.com” // 等待提示,然后输入yes
按照提示去目标的.ssh文件夹下找到id_rsa.pub文件,用记事本打开,拷贝全部内容。
打开https://github.com/,登陆你的账户,进入设置,然后是“SSH and GPG keys”。
New SSH Key 把刚刚拷贝的内容贴进去,title随便起。
回到命令行中执行:ssh -T git@github.com
等待提示出现后,输入yes。
然后可以继续刚刚命令行的步骤了。

用https代替git协议

公司的IT禁用了git协议端口,下载yocto代码时git://开头的URL会失败。可以用https协议来代替。

https协议代替git

git config —global url.”https://github.com/".insteadOf git@github.com:
git config —global url.”https://".insteadOf git://

取消设置

git config —global —unset-all url.https://github.com/.insteadof
git config —global —unset-all url.https://.insteadof
Check it with:
git config -l

git协议代替https

git config —global url.”git@github.com:”.insteadOf https://github.com/
git config —global url.”git://“.insteadOf https://

error: unable to create file drivers/gpu/drm/nouveau/nvkm/subdev/i2c/aux.h: Invalid argument

因为aux在windows系统中是关键字,不能创建这名的文件。如果在linux下也出现这个错误,可能你的磁盘分区是windows的NTFS格式,改成ext4格式就行了。

error: unable to rewind rpc post data - try increasing http.postBuffer

error: RPC failed; curl 56 GnuTLS recv error (-54): Error in the pull function.
fatal: The remote end hung up unexpectedly
加大postBuffer:

  1. git config --global http.postBuffer 2097152000
  2. git config --global https.postBuffer 2097152000

2097152000Byte = 2000MB

error: RPC failed; curl 18 transfer closed with outstanding read data remaining

也是加大加大postBuffer:

  1. git config --global http.postBuffer 2097152000
  2. git config --global https.postBuffer 2097152000