常用指令
从github中同步代码到本地,以github分支为master
为例
1 | git pull origin master |
从本地同步代码到github,以同步所有代码,github分支为master
为例:
1 | git add . |
查看当前所有远程分支
1 | git branch -a |
查看当前所有本地分支
1 | git branch |
切换分支
1 | git checkout +名字 |
删除远程分支,以远程服务为origin,删除test分支为例
1 | git push origin --delete test |
冲突解决
下拉时冲突
git pull
遇到错误:error: Your local changes to the following files would be overwritten by merge:
方法1:如果你想保留刚才本地修改的代码,并把git服务器上的代码pull到本地(本地刚才修改的代码将会被暂时封存起来)
1 | git stash |
方法2:如果你想完全地覆盖本地的代码,只保留服务器端代码,则直接回退到上一个版本,再进行pull:
1 | git reset --hard |
上传时冲突
git push
的时候报错hint: Updates were rejected because the tip of your current branch is behind
。
解决方法:本地分支强行覆盖远程分支,以github分支为master
为例
1 | git push -u origin master -f |
建立与远程仓库的连接
分为两种情况,若是自己的代码,需要手动在github上建立仓库;若是别人的代码,需要首先将别人的代码fork过来。
这里以fork的few-shot-gnn
仓库为例,在本地仓库敲下面指令与远程仓库建立连接。
1 | git remote add origin git@github.com:zdaiot/few-shot-gnn |
如果报错,提示说fatal: remote origin already exists.
,这是因为你本地仓库直接git clone
别人仓库的代码,而不是你仓库的代码。解决方法为:
1 | git remote rm origin |
然后再建立连接。
重建与远程仓库的连接
若是直接git clone别人的代码,但是不想fork,想直接上传,则首先git clone下来别人的代码。
然后
1 | git remote rm origin |
打开自己的github,新建一个仓库,例如名称为few-shot-gnn
,建立与远程仓库的连接
1 | git remote add origin git@github.com:zdaiot/few-shot-gnn |
此时,若是直接git push
,提示说fatal: The current branch master has no upstream branch.
则执行
1 | git push -u origin --all |
这时,通常github上只会有一个分支,要是想推送所有分支的话。例如还有一个分支adaboost
需要执行
1 | git checkout adaboost |
使用git remote -v
可以看到当前远程分支还是指向的之前的链接。所以需要
1 | git remote rm origin |
.gitignore规则无效
据我所知导致.gitignore里的忽略规则失效只有两种情况,当然我对Git的使用和理解比较浅薄,也只能想到这两个方面:一种是忽略规则的语法错误,这种情形好处理,只要修正错误的语法就可以了。PS:本文不对语法错误的问题详细说明,毕竟每个人情况不同。排查语法问题这事我也不知道怎么举例,总之只要符合官方规范的就可以了,需要注意的好像也就一个路径问题吧?!
另一种则是本文要重点说明的情况:项目中的文件或目录已经被纳入到Git的版本管理里面/跟踪文件清单,此时你再往.gitignore里添加此文件/目录的忽略规则就会发现毫无作用,因为已经被Git跟踪(track)的文件/目录无法被.gitignore忽略掉!。
这里再对上面一段所说的进行详细说明,所谓“已经被纳入到Git的版本管理里面/跟踪文件清单”,大体上指的是下面的三种情况:
- 已使用add命令开始跟踪项目文件或者将修改的文件放入暂存区/索引
- 已使用commit命令提交更新到本地仓库
- 已使用push命令将项目文件推送到了Git远程仓库了(例如GitHub)
上述的三种操作只要进行了其中一项,再添加对应文件的忽略规则都是不生效的!PS:这三个命令在GUI客户端上一般都可以找到对应的按钮和操作。
未进行提交操作的处理方式
如果此时还未进行提交操作,赶紧使用如下命令可及时挽救:git rm --cached <file>
,其中<file>
表示要从暂存区移除出去的文件名或者目录路径,注意可以使用通配符。不过Git有自己的通配符规则,所以要注意下差异,例如官方文档有提到在*
号前面是需要加反斜杠\
的(我有测试过不加也没事但是最好按照规范来),结合上面的案例,因为我们要移除bin文件夹下的所有文件,所以完整的Git命令为(注意路径一定要正确):
1 | git rm --cached WebApplication1/WebApplication1/bin/\* |
这里要留意忽略规则的添加时机,在命令执行后会有不同的影响,假设忽略规则是在git rm --cached <file>
命令执行前就设置了,那么当命令执行完成后马上就可以看到效果,bin文件夹及里面的所有文件会被Git直接忽略。如果在命令执行后还没有添加忽略规则,你会发现bin文件夹下的文件变成未被跟踪的状态,也就是最初的状态,此时你再添加忽略规则这些文件就会被忽略了。
文件已经进行提交操作的处理方式
如果bin文件夹已经被Git跟踪并提交到了本地版本库甚至远程版本库(例如GitHub),解决方法和上一小节中的方法是一样的,依然是使用git rm --cached <file>
这个命令。PS:在执行此命令前Git最好能保持干净的状态,也就是”nothing to commit, working tree clean”。
注意!!!在命令执行后受影响的文件都会变成未跟踪状态,此时一定要马上使用git commit -m ‘备注信息’命令提交这部分修改,如果还未设置.gitignore文件则可以设置后一并提交此次更新到本地仓库。这里千万不要使用任何GUI客户端去操作!因为不同GUI客户端可能有不一样的执行结果(例如可能会将文件重新纳入跟踪,等于刚刚的操作白费了)。
远程仓库强制覆盖本地仓库
执行下面语句:
1 | git fetch --all && git reset --hard origin/master && git pull |
git 舍弃某个文件的更改
当我们使用git reset --hard
指令时会舍弃所有的文件更改,但是有的时候我们只想舍弃某一个文件的更改,以record.xlsx
文件为例,应该使用如下方式:
1 | # 查看文件的修改记录 |
git file is being edited by
当遇到这个问题的时候。通常显示的是一个nano编辑器。首先会问你是否选项,这个时候输入y
即可。然后会显示一般情况下的nano编辑器样子,按ctrl+o
,保持当前修改。然后会让你输入文件名,随便输入即可,然后回车,输入y
,最后按下ctrl+x
退出,git就会正常工作。
重写某个repo的Git历史
经常碰见一种情况是,提交到github的时候,没有使用的邮箱不对,导致在Github没有记录你的Contributions,解决方法是使用脚本来改变某个repo的Git历史。
在执行这段脚本前,你需要准备的信息:
Mac、Linux下打开Terminal,Windows下打开命令提示符(command prompt)
给你的repo创建一个全新的clone
1
2git clone --bare https://github.com/user/repo.git
cd repo.git
复制粘贴脚本,并根据你的信息修改以下变量:
旧的Email地址
,正确的用户名
,正确的邮件地址
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
git filter-branch --env-filter '
OLD_EMAIL="旧的Email地址"
CORRECT_NAME="正确的用户名"
CORRECT_EMAIL="正确的邮件地址"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags按
Enter键
执行脚本。用
git log
命令看看新 Git 历史有没有错误把正确历史 push 到 Github
1
git push --force --tags origin 'refs/heads/*'
删掉刚刚临时创建的 clone
1
2cd ..
rm -rf repo.git
git配置用户名和密码
修改:
1 | git config --global user.name "Your_Username" |
查看:
1 | git config user.name |
git白名单
在.gitignore
文件中如下配置,可以忽略除了lapsvmp_v02/gui/*.mat
下的所有.mat
文件。
1 | *.mat |
参考
git pull遇到错误:error: Your local changes to the following files would be overwritten by merge:
解决.gitignore文件忽略规则无效git依然跟踪修改的问题
github上的版本和本地版本冲突的解决方法
it 提示fatal: remote origin already exists 错误解决办法
nano命令
fatal: The current branch master has no upstream branch
git 查看远程分支、本地分支、创建分支、把分支推到远程repository、删除本地分支
git 如何让单个文件回退到指定的版本
【git】强制覆盖本地代码(与git远程仓库保持一致)
How to delete remote branches in Git
为什么Github没有记录你的Contributions
github多账号如何切换? - Tyrael.Liu的回答 - 知乎
关于gitignore:Git中的白名单和子目录