克隆仓库
git clone
查看状态
git status
把文件加入缓冲区
git add
删除文件
git rm
仅仅删除git仓库中的文件但是仍然保留在工作区(比如误提交)
git rm --cached
文件重命名
git mv
把文件从缓冲区移除
git reset HEAD
查看修改内容
git diff
查看缓冲区和已提交的修改
git diff --staged
提交
git commit
git commit --amend
查看提交历史
git log
git log --pretty=oneline
git log --pretty=format
git log --since=2.weeks
git log -p
git log --graph
还原更改(还为进入缓冲区)
git checkout – 文件名
远程仓库
git remote -v
git remote add SHORT_NAME url
git fetch
git pull
git push
git remote show XXX
git remote rename xxx xxx
分支
新建分支
git branch BRANCH_NAME
切换分支
git checkout BRANCH_NAME
新建并切换到分支
git checkout -b BRANCH_NAME
截至到某次提交创建分支
git checkout -b BRANCH_NAME COMMIT_HASH
删除本地分支
git branch -d BRANCH_NAME
删除远程分支
git push origin --delete BRANCH_NAME
推送分支到远程服务器
git push --set-upstream origin BRANCH_NAME
当然也可以是用另一种强推的方式,只不过这种方式推送了之后会把本地分支和推送过去的远程分支关联起来,以后再push的时候就不用每次都写这条指令,只需要简单的"git push"就行,另一种方式就是强推
git push origin BRANCH_NAME
远程分支已经删除,如何同步删除本地分支
当远程分支删除后,我们使用如下命令
git remote show origin
查看远程仓库的情况,会看到
* remote origin
...
Remote branches:
master tracked
refs/remotes/origin/xxx stale (use 'git remote prune' to remove) #注意这一行
Local branches configured for 'git pull':
...
Local refs configured for 'git push':
...
- 切换到要删除的分支,先git pull合并一下
- 删除本地分支 “git branch -d xxx”
- 删除对远程分支的引用
根据相关提示,使用下面命令移除相关本地对远程分支的引用
git remote prune origin
恢复文件
1. 文件还未提交到缓冲区
git checkout -- FILE_NAME_BE_RESTORE
2. 已提交到缓冲区
即用了"git add"但是还没有"git commit"的文件
git reset HEAD FILE_NAME_BE_RESTORE
git restore FILE_NAME_BE_RESTORE 或者 git chekout -- FILE_NAME_BE_RESTORE
3. 已提交
即已用了"git commit"提交的文件,这个时候需要如下步骤
a. 找到具体要恢复的版本号
git log
假设我们找到的版本号是"9bf6c5620e2d882345ee3e1cf2cda73a2a0f7db9"
b. 使用checkout恢复到指定版本
git checkout COMMIT_HASH FILE_NAME_BE_RESTORE
如
git checkout 9bf6c5620e2d882345ee3e1cf2cda73a2a0f7db9 a/main/main.c
c. 使用如上命令后,文件会恢复到指定版本,然后自动add到缓冲区,需要使用commit提交
git commit -m "something"
如何在命令行中提交以"#"开头的说明,比如单号
当我们使用命令 “git commit” 的时候,会交互的要求输入提交说明,默认情况下,提交说明中以"#"开头的行都会被当作注释行从而给git过滤掉,比如这样的提交
#12345 description
related detail link
最后会变成
related detail link
以"#“开头的被过滤掉了,但是有时候我们还确实需要”#“开头,比如bug单号,所这时候可以设置一下git的注释标记字符,改成用其他字符就行,比如”;"
git config core.commentChar ";"
如何去掉git提交校验?
到.git文件夹的hooks文件夹,找到pre-commit文件,删除即可
切换分支后,相应的submodule没有自动切换(更新)?
原因为没有开启自模块的切换
git config --global submodule.recurse true
天朝git clone github的库的时候出现“Git Clone错误解决:GnuTLS recv error (-110): The TLS connection was non-properly terminated.“
apt-get install gnutls-bin
git config --global http.sslVerify false
git config --global http.postBuffer 1048576000
如何回滚?
找到需要回滚的那个提交id,然后执行指令
git reset --hard COMMIT_ID
1. 如果本地的commit还没有push
那就这样吧,该拉取合并的拉取合并,该改动的改动。当然,有的时候你可能在pull的时候发现冲突,然后又无法解决,又或者又冲突但是你只想要远端,这个时候就执行上面的指令回滚,然后正常pull。
2. 如果想把远端的也回滚了
git push --force
子模块
添加子模块
git submodule add submodule_url local_path
#例如 git submodule add http://hello_world.git ./Hello
这里默认情况下就这样添加的子模块是和远程库是断开的,也就是说你进入到子模块目录后,执行"git status",你会
看到"xxx detatched at …“,所以一般添加子模块时如果需要跟踪子模块,需要指定具体当前子模块是哪个分支,添加”-b"参数
git submodule add -b branch_name submodule_url local_path
删除子模块
删除子模块比较麻烦。
- 删除子模块文件夹
git rm --cached module_name
rm -rf local_module_folder
-
在.gitmodules文件中删除相应的子模块信息
-
进入.git/config文件中删除相应的子模块信息
-
删除.git/modules下的子模块文件夹
初始化子模块
git submodule init
更新子模块
git submodule update
也可以使用组合命令,一次初始化和更新
git submodule update --init --recursive
暂时忽略某个文件
git update-index --assume-unchanged FILE_NAME
#取消
git update-index --no-assume-unchanged FILE_NAME
设置vim为默认编辑器
git config --global core.editor "vim"
一些问题
1. 用git更新下来后的文件,只有一些简要的信息?
文件中只有类似下面的内容:
version https://git-lfs.github.com/spec/v1
oid sha256:4d7a214614ab2935c943f9e0ff69d22eadbb8f32b1258daaa5e2ca24d17e2393
这种问题,一般是git lfs没有安装导致文件从远端仓库拉下来之后无法解压导致,所以安装一下git lfs.
git lfs下载地址:点我
以Linux Ubuntu为例。
wget https://github.com/git-lfs/git-lfs/releases/download/v3.2.0/git-lfs-linux-amd64-v3.2.0.tar.gz
sudo tar -zxf git-lfs-linux-amd64-v3.2.0.tar.gz
cd git-lfs-3.2.0
sudo ./install.sh
2. 解决Terminal中Git base中文乱码(包括文件名乱码问题)
在命令行下输入:
git config --global core.quotepath false
3. 国内无法克隆clone github的库
配置一下
git config --global url."https://hub.fastgit.org/".insteadOf "https://github.com/"
当然也可以直接编写配置文件"~/.gitconfig",增加如下内容
[url "https://gitclone.com/github.com/"]
insteadOf = https://github.com/
4. git SSL certificate problem: unable to get local issuer certificate
错误: git SSL certificate problem: unable to get local issuer certificate
这个问题是由于没有配置信任的服务器HTTPS验证。默认,cURL被设为不信任任何CAs,就是说,它不信任任何服务器验证。
只需要执行下面命令就可以解决:
git config --global http.sslVerify false
5. Git每次都需要输入用户名密码
这是因为本地没有配置缓存
git config --global credential.helper store
6. 设置git是否转换换行符
git config --global core.autocrlf true|false
参考文章
git submodule添加、更新和删除
Git Clone错误解决:GnuTLS recv error (-110): The TLS connection was non-properly terminated.
子模块管理和使用