github使用技巧

常用指令

从github中同步代码到本地,以github分支为master为例

1
git pull origin master

从本地同步代码到github,以同步所有代码,github分支为master为例:

1
2
3
git add .
git commit -m "init"
git push origin master

查看当前所有远程分支

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
2
3
git stash
git pull origin master
git stash pop

方法2:如果你想完全地覆盖本地的代码,只保留服务器端代码,则直接回退到上一个版本,再进行pull:

1
2
git reset --hard
git pull origin master

上传时冲突

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
2
3
git remote rm origin
git remote add origin git@github.com:zdaiot/few-shot-gnn
git push -u origin --all

.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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 查看文件的修改记录
$ git log record.xlsx

commit 8ac3974e2cefe34b51e718a6dc03a3d02ec2c10f
Author: zdaiot <zdaiot@163.com>
Date: Wed Nov 27 10:28:24 2019 +0800

add record.xlsx

# 恢复到指定的版本
$ git reset 8ac3974e2cefe34b51e718a6dc03a3d02ec2c10f record.xlsx
Unstaged changes after reset:
M config.py
M models/build_model.py
M online-service/model/customize_service.py
M record.xlsx
M train_classifier.py

# 更新到工作目录
$ git checkout record.xlsx

git file is being edited by

当遇到这个问题的时候。通常显示的是一个nano编辑器。首先会问你是否选项,这个时候输入y即可。然后会显示一般情况下的nano编辑器样子,按ctrl+o,保持当前修改。然后会让你输入文件名,随便输入即可,然后回车,输入y,最后按下ctrl+x退出,git就会正常工作。

重写某个repo的Git历史

经常碰见一种情况是,提交到github的时候,没有使用的邮箱不对,导致在Github没有记录你的Contributions,解决方法是使用脚本来改变某个repo的Git历史。

在执行这段脚本前,你需要准备的信息:

  1. Mac、Linux下打开Terminal,Windows下打开命令提示符(command prompt)

  2. 给你的repo创建一个全新的clone

    1
    2
    git clone --bare https://github.com/user/repo.git
    cd repo.git
  1. 复制粘贴脚本,并根据你的信息修改以下变量:旧的Email地址正确的用户名正确的邮件地址

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #!/bin/sh
    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
  2. Enter键 执行脚本。

  3. git log命令看看新 Git 历史有没有错误

  4. 把正确历史 push 到 Github

    1
    git push --force --tags origin 'refs/heads/*'
  5. 删掉刚刚临时创建的 clone

    1
    2
    cd ..
    rm -rf repo.git

git配置用户名和密码

修改:

1
2
git config --global user.name "Your_Username"
git config --global user.email username@xxx.com

查看:

1
2
3
4
git config user.name	
git config user.email

vim ~/.gitconfig

参考

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的回答 - 知乎

------ 本文结束------
坚持原创技术分享,您的支持将鼓励我继续创作!

欢迎关注我的其它发布渠道