合集"/>
git日常使用合集
文章目录
- 0. 常见使用
- 1. git add相关
- 2. git clone项目的版本
- 2.1 查看版本
- 2.2 clone某个分支
- 3. 更新本地仓库至远程最新版
- 3.1 git clone指定分支(branch/tag)
- 3.2 git clone 指定commit或者hash
- 3.2 更新本地仓库与远程仓库同步
- 3.2.1 直接更新
- 3.2.2 多分支
- 3.2.3 强制覆盖本地
- 3.2.4 强制覆盖远程
- 3.3 删除本地分支和对应的远程分支
- 3.4 删除远程文件
- 4. git删除本地文件push到远程
- 5. git提交一个空文件夹
- 6. 将本地文件夹上传至github
- 7. 在线更新git工具
- 8. 同步时,某个本地仓库修改没有提交,再pull的时候报错Please commit your changes or stash them before you merge
- 9. 查看commit的内容/删除还没有push的commit里的东西
- 10. git clone --depth=1
- 11. github和gitlab账号共存
- 12. 在某个repo中创建自己的分支
- 12.1 创建自己的分支
- 12.2 后续提交到自己的分支
- 13. 查看分支关系图
- 14. 修改一个已有项目的remote url指向(push一个已有的git项目)
- 15. push一个已有的文件夹
- 16. git文件夹重命名
- 17. merge
- 18. Updates were rejected because the remote contains work that you do not have locally
- 19. git回退单个文件到指定版本
- 20. git push HTTP/2 stream 1 was not closed cleanly before end of the underlying stream
- 其他
- git工作流(git-flow)
- Git入门课程
- 实现自己的仓库与别人的同步(Watch、Star、Fork)
- 分支与合并
0. 常见使用
团队使用gitlab,但是使用的语法还是git。创建项目的时候显示了很多常见语句,整理如下:
# Git global setup
git config --global user.name "XXX"
git config --global user.email "XXX"# Create a new repository
git clone XXXX/extract_frame.git
cd extract_frame
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master# Push an existing folder
cd existing_folder
git init
git remote add origin XXX/extract_frame.git
git add .
git commit -m "Initial commit"
git push -u origin master# Push an existing Git repository
cd existing_repo
git remote rename origin old-origin
git remote add origin XXX/extract_frame.git
git push -u origin --all
git push -u origin --tags
1. git add相关
参考:【git】git add 添加错文件 撤销
要上传的文件名进行不要出现中文,不然在使用status查看add的文件时,就会出现一些意料之外的字符。。。。
git add *
git add .
# 上面两个都可以起到添加当前文件夹下全部文件的效果
git status
# 查看add的文件# 添加错文件想要撤销
git reset HEAD
# 如果后面什么都不跟的话 就是上一次add 里面的全部撤销了
git reset HEAD XXX/XXX/XXX.java
# 就是对某个文件进行撤销了
撤销后再查看状态,可以看到没有被添加要提交的内容
这样的提示。
2. git clone项目的版本
2.1 查看版本
定位到包含.git
文件夹的目录,使用git branch
就可以看到当前仓库存在的分支(通常我们只会git clone一个分支,所以此时返回的内容就是当前仓库的版本号信息。)
git branch
git branch -r/-a
另外,也可以直接在config文件中查看:
另外,也可以
git log
这里有一个commit+提交的版本号,其实和gitlab上显示的这个SHA序号是一致的,这里只显示了一部分,复制就可以看到全部序列是一串很长的字符。
2.2 clone某个分支
使用-b
参数指定要访问的分支
git clone -b XXXbranch http://XXXX/XXX.git
3. 更新本地仓库至远程最新版
3.1 git clone指定分支(branch/tag)
最简单的一种lowB方式就是换个文件夹重新git clone
,以PaddlePaddleOCR
为例,默认就是最新的版本,但是切换分支后发现,这些分支对应的https链接都是一样的,
根据:使用git克隆指定分支的代码可知,下载指定分支release/2.1的命令如下:
git clone -b 分支名 仓库地址
# 其中分支名 就是github上看到的`release/2.1`
git clone -b release/2.1 .git
"""
会报错
fatal: unable to access '.git/':
gnutls_handshake() failed: The TLS connection was non-properly terminated.
"""
# 下面这个是对的
git clone -b v2.1.1 .git
有些branch分支是没有代码的,无法使用,所以最好使用tags,参考GitHub下载克隆clone指定的分支tag代码
git clone --branch [tags标签] [git地址] 或者 git clone --b [tags标签] [git地址]
# 这里-b最好给tags标签
git clone -b 1.4.1 .git
3.2 git clone 指定commit或者hash
简单来说,就是正常下载repo,然后用checkout切到对应的commit记录上去
git clone [remote_address_here] my_repo
cd my_repo
git reset --hard [ENTER HERE THE COMMIT HASH YOU WANT]
参考:
- Git clone particular version of remote repository
- How to clone a specific Git tag
3.2 更新本地仓库与远程仓库同步
参考:git 更新本地代码
大致分为几种情况:
3.2.1 直接更新
——本地代码未修改,只有master分支,直接更新
git pull
但前提必须是本地的代码没更改过。比如,你提交了代码到 github 后,随后别人也提交代码到 github,然后你需要更新别人提交的代码到你本地,
就可以直接使用该命令。假如你提交代码后再修改过你本地的代码,就会产生冲突,直接使用该命令会失败的。
3.2.2 多分支
——本地代码有修改,多分支。
//切换到master分支
git chekout master//更新master分支
git pull//切换到自己的分支isso
git checkout isso//把master分支合并到自己分支
git merger master
3.2.3 强制覆盖本地
——本地代码有修改,只有master分支,直接覆盖本地代码
//重置索引和工作目录
git reset --hard//更新代码
git pull
3.2.4 强制覆盖远程
——本地代码有修改,直接覆盖远程仓库代码
// 覆盖isso分支
git push --force origin isso// 覆盖主分支
git push --force origin master
3.3 删除本地分支和对应的远程分支
# 删除remote的分支
git push -d <remote_name> <branchname>>git push -d origin CastleDream/support_BDD100K
To github:CastleDream/mmsegmentation.git- [deleted] CastleDream/support_BDD100K# 删除本地的分支,-d是delete,-D是delete force,都可以
git branch -d <branchname>
> git branch -D CastleDream/support_BDD100K
Deleted branch CastleDream/support_BDD100K (was 221ac91).
参考:
- how do I delete a git branch locally and remotely
3.4 删除远程文件
比如:不小心把.ipynb_checkpoint
文件上传到github中了,想要对远程仓库中的文件进行删除,可以
git rm --cached 'file name'
git commit -m'message'
git push -u origin branch
参考:
- Git - how delete file from remote repository
4. git删除本地文件push到远程
在windows操作系统上,一开始直接在文件管理器上进行删除,然后
git add *
git commit -m
git push
然后就报错,说本地和远程存在不一致文件
正确删除本地文件,再push到远程的做法是:
$ git rm -r '需要删除的文件夹'
# 执行这句后,文件管理器就已经看不见这个文件夹了
$ git commit -m "delete data"
$ git push -u origin master
一开始直接写错文件夹路径,然后直接把要删除的文件夹拖进git bash这个CLI中,就可以看到路径了
可以看到,其实还是完整路径,c/表示c盘。。。
PS:如果还是报错,那就先执行一下git pull,保证本地和远程一致之后,再进行上面的rm操作序列
参考:git 提交本地文件,删除文件夹,修改文件等
5. git提交一个空文件夹
参考:如何在Git提交空文件夹
.gitkeep是一个占位文件。
Git是不会把一个完全空的文件夹添加到版本控制里,为了让空文件夹被跟踪,常规做法是在空文件夹里添加.gitkeep。
注意:.gitkeep并不是Git的特性。Git没有对占位文件名有要求,你可以放一个README也行。
Git:.gitignore和.gitkeep文件的使用
6. 将本地文件夹上传至github
其实分两部分操作
第一部分:本地操作,在需要上传到github的文件夹中,执行以下命令
# 把这个文件夹变成Git可管理的仓库
git init
# 登陆github账号 global也可以换成local 看自己情况
$ git config --global user.name 'catalinaLi' #公司账号名称
$ git config --global user.email 'catalinaLi@companyName' #公司账号邮箱# 然后需要添加要上传的内容
git add *
# 提交的信息提示
git commit -m "first commit"
# 连接远程仓库
git remote add origin .git
# 上传内容
git push -u origin master
第二部分: github上操作,新建一个repo,不要勾选readme选项,这样下面会有使用的命令提示。
参考:
- ✅如何将本地项目上传到Github
- 如何将本地的代码上传到github
7. 在线更新git工具
今天想push一个项目的时候,走神,把git后面的参数写成了 update,然后就自动更新了??哈哈
8. 同步时,某个本地仓库修改没有提交,再pull的时候报错Please commit your changes or stash them before you merge
常见的方式有三种:
先把修改过的内容commit上去
git commit -m "My message"
不保留本地改动 直接覆盖
git reset --hard
# 或者
git checkout -t -f remote/branch
# 或者,单纯放弃某个文件的更改
git checkout filename
想要保留本地的更改
git stash # 将改动藏起来
git pull # 用新代码覆盖本地代码
git stash pop # 将刚藏起来的改动恢复
参考:
- 简书文章:Git: pull时提示Please commit your changes or stash them before you merge.
- Stack Overflow-How do I resolve git saying “Commit your changes or stash them before you can merge”?
9. 查看commit的内容/删除还没有push的commit里的东西
add *
并提交之后,才从提交的打印信息里看到有些内容被错误添加了,因此使用rm删除(删除当前commit里不想要push的内容),但是不确定剩余的commit
内容是否正确
git add *
git commit XXX
git rm XXX # 这里删除也只是删除了工作区
git commit --amend -CHEAD # 再次提交会覆盖上次提交的内容,然后push就可以了
如果想要查看某次提交的具体内容,可以:
git log #找到最新一次提交的 hash ID,一般只需要前6位字符即可
git show 79ac00 # 就可以看到具体信息了
10. git clone --depth=1
只克隆下包含最近一次commit的一个分支,可以使用depth
来指定深度
git clone --depth 1 --branch english .git
参考:
- 详细介绍git clone --depth=1的用法
11. github和gitlab账号共存
一般做法是:gitlab设为global,github设为local
因为公司使用gitlab,用处会多一些,所以可以将公司gitlab的账号设置为global的,例如:
$ git config --global user.name 'catalinaLi' #公司账号名称
$ git config --global user.email 'catalinaLi@companyName' #公司账号邮箱
global(用户级别):
位于~/.gitconfig,具体到你的用户。你可以通过传递–global 选项使Git 读或写这个特定的文件。
以我本机为例,Windows系统下,在C:\Users\username\.gitconfig
:
内容也非常简单,就是用户名和邮箱:
而如果是个人的github项目,可以设为local,例如:
$ git config --local user.name 'username' #github账号名称
$ git config --local user.email 'username@gmail' #github账号邮箱
这个需要先进入一个github的repo,init之后使用上述命令。
local(仓库级别):
位于 .git/config,无论你当前在用的库是什么,特定指向该单一的库。每个级别重写前一个级别的值。
以我本机的一个为例:
其中的内容就会多一些,有明确的repo的指向
参考:
- 如何在同一台电脑上使用github和gitlab
- 同一台电脑上个人的github账户如何与公司的gitlab账户共存
12. 在某个repo中创建自己的分支
12.1 创建自己的分支
英语可以搜索关键词git create branch from master
简单来说,就是
git checkout -b <sub-branch> branch
# -b 你要创建的新的子分支
# branch 创建的分支所基于的分支# 例如
$ git checkout -b huangs master
Switched to a new branch 'huangs'
# 执行完上面的命令后,会默认帮你切换到自己新建立的那个分支
$ git checkout huangs
# 也可以使用这个方式来切换到huangs分支上去git push origin huangs
# 将当前内容(上一句命令已经切换到huangs分支了)推送到 origin路径里的huangs分支里去
注意,要在这个repo的目录里运行。。。
主要参考
- Stack Overflow:Create a branch in Git from another branch
- atlassian:Git Checkout
12.2 后续提交到自己的分支
报错:
error: src refspec huangs does not match any.
error: failed to push some refs to
建议:
- 先切换到自己的分支,再进行文件编辑等操作
- 不然会报错,需要先把修改保存,才能切换分支
git add *
git commit -m "XXXX"
# 可能会提示你输入用户名密码
git config --global user.email "XXX@XXX"
git config --global user.name "XXX"# 输完用户名之后,再去提交
git commit -m "first update"
[dev 68ae78b] first update3 files changed, 792 insertions(+)create mode 100644 segVol/config/train_test_heart.cfgcreate mode 100644 segVol/config/train_test_hematoncus.cfgcreate mode 100644 segVol/runSegMain.py# 一开始我以为可以保存后直接提交到自己的分支,但是报错必须先把之前的提交或者换分支之前stash了
git checkout huangs
error: Your local changes to the following files would be overwritten by checkout:XXX/.gitignore
Please commit your changes or stash them before you switch branches.
Aborting# 想要保留本地的更改,可以
git stash # 将改动藏起来
> Saved working directory and index state WIP on dev: XXX first updategit pull # 用新代码覆盖本地代码
> Username for 'http://XXXX': XXXX
Password for 'http://XXX@XXX':
Already up to date.# pull把远程更新到本地,就可以切换分支了
git checkout huangs
Branch 'XXX、' set up to track remote branch 'XXX' from 'origin'.
Switched to a new branch 'XXX'# 切换分支之后就可以把刚刚的更新恢复
git stash pop # 将刚藏起来的改动恢复
> Auto-merging XXX/.gitignore
CONFLICT (content): Merge conflict in XXX/.gitignore# 然后push到远程
git push origin huangs
Username for 'http://XXXX': XXX
Password for 'http://XXX':
Everything up-to-date# 可以看到现在就在自己的分支了
git branchdev
* huangs
但是还是有些问题,之前编辑的文件消失了。。但是其实问题很简单,
- 之前的文件默认是在
dev
分支上做的修改,上面的操作其实也只是在修改文件没有commit无法切换分支的解决方式 - 因此如果想看到之前的文件,只需要切换到
dev
分支即可,即git checkout dev
13. 查看分支关系图
根据Stack Oveflow:Relationship between n git branches
直接使用以下命令:
$ git log --graph --decorate --oneline --simplify-by-decoration --all* f3f616b (origin/dev) Merge branch 'abc' into 'dev'
| * 9b07710 (origin/abc) add RandomAffine
|/
* 7b7f92c (origin/drf) update configuration
* 3d03b4f (HEAD -> master, origin/master, origin/123, origin/HEAD) merge from master
* 7873e87 init dev for XXX
如果想查看特定分支的,把--all
改成相应的分支即可,例如
$ git log --graph --decorate --oneline --simplify-by-decoration master
也可以参考git graph 图线,中文的,比较好懂。
14. 修改一个已有项目的remote url指向(push一个已有的git项目)
我的情景是:我clone了某个repo,进行修改后,要把它传到另一个新建的repo上去。
"方式1,直接重新设置url"
git remote -v #查看原始的fetch和push路径
> origin http://XXXX/user/test.git (fetch)origin http://XXXX/user/test.git (push)git remote set-url origin .git # 更换新的仓库地址 "方式2,重命名旧的url,然后指向新的"
cd existing_repo
git remote rename origin old-origin
git remote add origin :8888/ai/miccai-challenge.git
- 其实方式2就是0.常见使用的最后一部分,
- 也是在GitHub或者gitlab上创建一个新项目,项目主页会显示的一些基础命令
参考:
- Git更改远程仓库地址
15. push一个已有的文件夹
这其实也是0.常见使用的靠后的命令
cd existing_folder
git init
git remote add origin :8888/ai/miccai-challenge.git
git add .
git commit -m "Initial commit"
16. git文件夹重命名
git mv <oldname> <newname>
# 例如
git mv testAD 1.testAD
# 注意新名字里不要有空格,必须加空格的话就 1.\ testAD 加个转义符
参考:
- [Git] git重命名文件和文件夹详解
- In a Git repository, how to properly rename a directory?
- 这个回答很久了,目前如果是修改文件夹大小写,一步
mv
就可以,不需要两步
- 这个回答很久了,目前如果是修改文件夹大小写,一步
17. merge
参考:
- Git命令解析 - merge、rebase
- Git文档——git-merge
- Git Branch Merge
- atlassian-Git Merge
18. Updates were rejected because the remote contains work that you do not have locally
完整提示信息如下:
出现这一问题的原因是:
- 我只add了几个自己修改过的文件
- 但是远程的其他文件被别人修改了,所以会提示容易有不一致问题
- 如果确定自己添加的这几个文件不会与远程冲突
那么根据stackoverflow的回答:Updates were rejected because the remote contains work that you do not have locally
- 直接强制上传就行,即
git push -f origin master
- 如果是某个分支,就
git push -f origin branch_name
19. git回退单个文件到指定版本
如果不想整个项目都回退到某个commit,尤其是多人开发的时候。可能会有想回退单个文件,或者单个文件夹到指定版本的需求。
假设要回退到的commit的hash是c5f567
,则可以使用checkout
命令
git checkout c5f567 -- file1/to/restore file2/to/restore# 加上~序号,表示回滚到c5f567的上几个commit(~1,就是回滚到c5f567的前一个commit)
git checkout c5f567~1 -- file1/to/restore file2/to/restore
也可以去看git的官方手册:git-checkout
参考:
- stackoverflow:How do I reset or revert a file to a specific revision?
20. git push HTTP/2 stream 1 was not closed cleanly before end of the underlying stream
报这个错就是网络有问题,要么就是代理有问题
macOS下git的config文件位置:$HOME/. gitconfig
参考:
- HTTP/2 stream 1 was not closed cleanly before end of the underlying stream
- unable to connect to git server via http: HTTP/2 stream 0 was not closed cleanly: PROTOCOL_ERROR (err 1)
其他
git工作流(git-flow)
图自这里
参考:
- Github repo:
Git入门课程
慕课网Git入门
实现自己的仓库与别人的同步(Watch、Star、Fork)
刚入职遇到一个项目,老大为了善用工具,提出大家使用github,本以为fork之后就会和原项目各种同步,结果,看了如何用好 GitHub 中的 Watch、Star、Fork之后,我明白,
- 单纯的fork与原项目没有啥关系,无法得到原项目在你fork之后的任何更新,即fork的项目只是保留了fork当时的状态,如果项目作者在你fork之后更新了项目,你是看不到的。
- 即便使用watching来关注该项目,也只配通过绑定邮箱得到新的issue,commit,pull request提示,也不能实现追踪某个项目,获取同步信息。
参考
- github如何实现fork的项目与原项目同步
- Github上fork项目后与原项目保持同步
- 本地已经存在的项目如何跟github发生关联
- git中文文档
- git英文
分支与合并
- 3.2 Git 分支 - 分支的新建与合并
- GitHub–创建新的分支(转)
- github合并分支到master
- Git:clone、设置远程仓库对应
- GitHub分支创建及合并
不使用账号密码登陆,使用ssh秘钥登陆。
关于账号密码的查看,参考:1.6 Getting Started - First-Time Git Setup
更多推荐
git日常使用合集
发布评论