Git Tips

教程

  1. 阮一峰的网络日志
  2. 这些GIT经验够你用一年了
  3. Cheatsheet

删除远程分支

git branch -r -d origin/branch-name
此时需要更改仓库的默认分支,不然直接运行下面的命令会报错
git push origin :branch-name

图中第一次是更改默认分支前的出错信息,第二次是更改完默认分支的信息。

删除本地分支

git branch -d branch-name

提高git clone速度

git config --global http.postBuffer 524288000

git clone所有远程分支

git clone ....
cd ..
git branch -a
git checkout -b gh-pages origin/gh-pages

git删除大文件

cnblog

初次配置Git

reference

  1. 下载安装

    apt-get install git
    

  2. 配置

    git config --global user.name "test"
    git config --global user.email "test@163.com"
    

  3. ssh

    ssh-keygen -t rsa -C "test@163.com"
    

复制~/.ssh/id_rsa.pub到github上。

修改origin

git remote rm origin
git remote add origin git@192.168.1.18:mStar/OTT-dual/K3S/supernova

or

git remote set-url origin git@192.168.1.18:mStar/OTT-dual/K3S/supernova

gitignore 失效

.gitignore

有时候在项目开发过程中,突然心血来潮想把某些目录或文件加入忽略规则,按照上述方法定义后发现并未生效,原因是.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。那么解决方法就是先把本地缓存删除(改变成未track状态),然后再提交:

git rm -r --cached .
git add .
git commit -m 'update .gitignore'

更新远程代码到本地

方式一

git remote -v
git fetch origin master
git log -p master origin master
git merge origin master

方式二

git fetch origin master:temp
git diff temp
git merge temp
git branch temp

关于LICENSE的选择

阮一峰的网络日志

git clone 某个分支或所有分支

git clone

git clone -b BRANCH_NAME ...

or

git clone ...
git branch -r
git checkout BRANCH_NAME

更改远程仓库的名字

举个例子,如将一个名为epi的仓库改名为depi,再次在本地提交虽然也能成功,但是会提示你原始的仓库已经移动,请修改为新的仓库地址,于是我们可以利用下面的命令进行修改

git remote set-url origin git@github.com:szcf-weiya/depi.git

git pull

在使用rstudio的git功能时,某次commit的时候,勾选了amend previous commit,然后push的时候就出错了

后来直接运行git pull后,重新push,便解决了问题。

附上git pull的某篇博客git pull命令

Webhook配置

参考Webhook 实践 —— 自动部署

需要在腾讯云服务器上自动更新github pages的内容,于是采用webhook来实现。

npm install -g forever
forever statr server.js

显示 user.name 和 user.email

git config user.name
git config user.email

删除github的master分支

参考删除github的master分支

Git push与pull的默认行为

参考Git push与pull的默认行为

GitHub 项目徽章的添加和设置

参考GitHub 项目徽章的添加和设置

以及

shields.io

webhooks 响应特定分支的 push

参考Web Hooks - execute only for specified branches #1176@rtripault

提取 json 中的 ref,在 do_POST() 中进行设置响应动作。

命令行同步 fork 的仓库

  1. 添加原仓库,比如
git remote add upstream git@github.com:LCTT/TranslateProject.git

查看当前远程仓库

git remote -v
  1. pull
git pull upstream master

参考Quick Tip: Sync a GitHub Fork via the Command Line

git checkout

  • 撤销未被 add 的文件
git checkout -- file
  • 撤销所有更改
git checkout -- .

参考git checkout all the files

  • 从其他分支更新文件
git checkout master -- SOMEFILE

参考 Quick tip: git-checkout specific files from another branch

rewrite 时百分比的含义

表示相似性。

参考What does the message “rewrite … (90%)” after a git commit mean? [duplicate]

Travis CI

中文折腾为什么 Travis CI 中用 ‘*’ 号不会上传文件,最后还是指定了文件名。

刚刚找到解决方案 How to deploy to github with file pattern on travis?

简单说要加上

file_glob: true

放弃本地修改

git add

直接用 git checkout .

git add

git reset HEAD

commit

git reset --hard HEAD^

参考git 放弃本地修改

列出另一分支的目录

git ls-tree master:dirname

Github 回退

git reset --hard HEAD^
git push origin HEAD --force

参考 1. github,退回之前的commit 2. github 版本回退

修改 commit 信息

If the latest commit, type

git commit --amend

to edit the commit message, and then

git push --force-with-lease

Refer to Changing git commit message after push (given that no one pulled from remote).

cannot lock ref

参考 git pull时遇到error: cannot lock ref ‘xxx’: ref xxx is at (一个commitID) but expected的解决办法

另外试试 git gc

参考

  1. Git and nasty “error: cannot lock existing info/refs fatal

remove untracked files

git clean -n
git clean -f

refer to How to remove local (untracked) files from the current Git working tree

分支操作

详见 Git 分支 - 分支的新建与合并

CRLF & LF

双系统切换时,原先在 Win 处理,后来换到 Linux 处理,报出

CRLF will be replaced by LF.

设置 autocrlf 配置项:

  • false 表示取消自动转换功能。适合纯 Windows
  • true 表示提交代码时把 CRLF 转换成 LF,签出时 LF 转换成 CRLF。适合多平台协作
  • input 表示提交时把 CRLF 转换成 LF,检出时不转换。适合纯 Linux 或 Mac

参考 Git 多平台换行符问题(LF or CRLF)

Git push require username and password

possible reason: use the default HTTPS instead of SSH

correct this by

git remote set-url origin git@github.com:username/repo.git

参考 Git push requires username and password

manually resolve merge conflicts

  1. open the file and edit
  2. git add
  3. git commit

refer to How do I finish the merge after resolving my merge conflicts?

push

采用低版本的 git, 如 v1.8.3.1 当 push 时会报出以下提醒信息,

warning: push.default is unset; its implicit value is changing in
Git 2.0 from 'matching' to 'simple'. To squelch this message
and maintain the current behavior after the default changes, use:

  git config --global push.default matching

To squelch this message and adopt the new behavior now, use:

  git config --global push.default simple

See 'git help config' and search for 'push.default' for further information.
(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode
'current' instead of 'simple' if you sometimes use older versions of Git)

而自己本机电脑一般采用 v2.0+, 比如当前 v2.17.1 的 git,所以直接采用 simple 模式便好了。

alias

本来想同时在一行命令中运行 git add .git commit -m,但是如果采用 ; 或者 && 连接时都报错,

error: unknown switch `m’

顺带发现了 ;&& 以及 || 的区别,详见 Run multiple commands in one line with ;, && and || - Linux Tips

  • ;: 无论第一个命令成功与否,都会运行第二个命令
  • &&: 只有当第一个命令成功运行,才会运行第二个命令
  • ||: 只有当第一个命令失败后,才会运行第二个命令

后来发现这个,Git add and commit in one command,可以通过 git config 来配置 alias,

git config –global alias.add-commit ‘!git add -A && git commit’

则以后只需要调用

git add-commit -m ‘My commit message’

这跟在 .bashrc 中配置有异曲同工之妙!

标签

  • 打标签
# annotated
git tag -a v1.0 -m "version 1"
# lightweight
git tag v1.0
# push to github
git push origin v1.0
# or 
git push origin --tags

详见 2.6 Git 基础 - 打标签

  • 删除标签
# local
git tag -d v1.0
# github
git push origin :refs/tags/v1.0

详见 mobilemind/git-tag-delete-local-and-remote.sh