本文最后更新于 over 2 years ago,文中所描述的信息可能已发生改变。
记录 Git 的一些常用指令与问题解决方案。
ref
常用指令
拉取代码
从远程仓库获取线上代码:
git clone git@github.com:用户名/项目名.git
关联远程仓库:
git remote add origin git@github.com:xxx/xxx.git
(git clone 后已自动关联)git 拉取代码更新项目:
git pull origin master
远程仓库
删除远程仓库地址:
git remote rm origin
增加远程仓库地址:
git remote add origin git@github.com:xxx/xxx.git
orgit remote add origin https://github.com/xxx/xxx
( origin 为远程仓库命名)查看远程库信息:
git remote -v
关联多个远程仓库:
git remote add github git@github.com:xxx/xxx.git
git remote add gitee git@gitee.com:xxx/xxx.git
git remote add coding git@git.coding.net:xxx/xxx.git
代码推送
git 初始化: git init
保存到暂存区: git add -A
输入描述信息并提交到本地的 Git:
git commit -m "Say something"
修改已经提交的描述:
git commit --amend
修改已提交内容将代码推送到 GitHub:
git push
orgit push -u origin master
( -u 选项指定一个默认主机,后面就可以不加任何参数使用 git push )强制推送:
git push -u origin master -f
清空文件夹的本地缓存:
git rm -r --cached <path>
代码回滚
在 Git 中,用 HEAD 表示当前版本,,上一个版本就是 HEAD^,上上一个版本就是 HEAD^^,当然往上 100 个版本写 100 个^比较容易数不过来,所以写成 HEAD~100。
--hard
会包括当前源码回到上次状态。 保留当前更改,只回退 commit 信息可使用 --soft
。 清除缓存区中准备提交的内容,只保留修改的状态,可不加参数,或使用 --mixed
。
回滚到上一版本:
git reset --hard HEAD^
回退到指定版本
git reset --hard id
(id 为 commit 版本号,填写前数位保证不重复即可)通过
git log
查看历史版本
分支管理
显示当前分支
git branch -v
显示远程分支
git remote -v
将当前分支切换到 master 分支上:
git checkout master
创建一个名为 xxx 的新分支:
git checkout -b xxx
,-b
选项表示创建指定名称的新分支。新建远程分支:
git push origin
推送的分支:远程的分支合并分支:
git merge fake-branch
删除分支:
git branch -d fake-branch
删除远程分支:
git push origin –-delete
分支名修改分支名称:
git branch -m old_branch_name new_branch_name
批量删除分支:
git branch | grep 'refactor/*' | xargs git branch -d
- 譬如删除所有包含
refactor/
名称的分支
- 譬如删除所有包含
清除缓存
git rm --cached [文件路径]
-r
递归-f
强制
Example: git rm -r --cached .
凭证存储
git config --global credential.helper store
FAQ
合并代码冲突
- 如果系统中有一些配置文件在服务器上做了配置修改,然后后续开发又新添加一些配置项的时候, 在发布这个配置文件的时候,会发生代码冲突:
error: Your local changes to the following files would be overwritten by merge:
protected/config/main.php
Please, commit your changes or stash them before you can merge.
- 如果希望保留生产服务器上所做的改动,仅仅并入新配置项, 处理方法如下:
git stash
git pull
git stash pop
- 反过来,如果希望用代码库中的文件完全覆盖本地工作版本. 方法如下:
git reset --hard //重置到上次提交的状态
git pull
提交至 GitHub 时出现 invalid-email-address
查看 git 设置:
cat $HOME/.gitconfig
正常情况应显示 [user]name 与 email 的信息。
若无,通过如下代码修改 git 配置。
git config --global user.name "用户名"
git config --global user.email "Git账户邮箱"
修改已经使用 invalid-email 提交的 commit 信息
(若不知道无效邮箱的具体地址,可通过
git log
查看提交时的邮箱地址。)
合并两个不同的项目,出现错误
fatal: refusing to merge unrelated histories
因为他们是两个不同的项目,要把两个不同的项目合并,git 需要添加一句代码,在
git pull
后添加--allow-unrelated-histories
假如我们的源是
origin
,分支是master
:git pull origin master ----allow-unrelated-histories
删除已经上传至 GitHub 中的文件
上传项目的时候有些需要忽略的文件夹并未加入 .gitignore
文件中,导致上传了一些并不想上传的文件。
我们想要在 github 上面删除,但又不想在本地删除。
Example:
git rm -r --cached .idea #--cached不会把本地的 .idea 删除
git commit -m 'delete .idea dir'
git push -u origin master
修改已提交内容
git commit --amend
# 修改 commit message
git commit --amend --author="simimi <me@simimi.cn>"
修改之前已经上传的提交
修改方法一
git rebase -i HEAD~1 #当前版本的倒数第一次状态
- 显示结果如下,修改
pick
为edit
,并按esc
输入:wq
保存退出
pick 578ba7a hexo backup
# Rebase eeb9c17..578ba7a onto eeb9c17 (1 command)
#
# Commands:
# pick = use commit
# edit = use commit, but stop for amending //改上面的 pick 为 edit
# squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
12
修改方法二
# 修改需要修改的地方(只是修改 commit message 就不用做)
git add . #这一步如果只是修改 commit message 不用输入
git commit --amend
# 输入修改后的 commit message,保存
输入
git rebase –continue
完成操作推送
git push <remote> <branch>
# Example: git push origin add-something
修改方法三
找到想要修改的 commit 的父 commit id
git rebase -i <父 commit id>
pick 578ba7a hexo backup
2
...
pick
修改为 reword
, :wq
退出。
此时可以修改更改 reword
的 commit message,wq
退出。
剩余的 git rebase --skip
How to modify existing, unpushed commit messages? > Removing sensitive data from a repository | GitHub
删除过去分支已经存在的某个文件
譬如删除 assets/xxx.psd
文件。
git filter-branch -f --prune-empty --index-filter 'git rm -rf --cached --ignore-unmatch assets/xxx.psd' --tag-name-filter cat -- --all
增加子模块
git submodule add https://github.com/XXX/XXX
清除本地修改
git clean -d -fx
d 删除未被添加到 git 的路径中的文件
f 强制运行
x 删除忽略文件已经对 git 来说不识别的文件
关闭 Windows CRLF
git config --global core.autocrlf false
Tag 相关
# 添加 Tag
git tag v2.0.0
# 推送 Tag
git push origin --tags
# 删除远程 Tag
git tag -d 1.2.0
git push origin :refs/tags/1.2.0
全局 gitignore
git config --global core.excludesfile $HOME/.gitignore
https://stackoverflow.com/questions/5724455/can-i-make-a-user-specific-gitignore-file
git 代理
# 设置代理
git config --global http.proxy http://127.0.0.1:1087
git config --global https.proxy https://127.0.0.1:1087
# 取消代理
git config --global --unset http.proxy
git config --global --unset https.proxy
详解
git push
- git push origin master
上面命令表示,将本地的 master
分支推送到 origin
主机的 master
分支。如果 master
不存在,则会被新建。
如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略。
git push origin
上面命令表示,将当前分支推送到 origin
主机的对应分支。如果当前分支只有一个追踪分支,那么主机名都可以省略,使用 git push
。
如果当前分支与多个主机存在追踪关系,则可以使用 -u
选项指定一个默认主机,这样后面就可以不加任何参数使用 git push
。
git push -u origin master
上面命令将本地的 master
分支推送到 origin
主机,同时指定 origin
为默认主机,后面就可以不加任何参数使用 git push
了。
不带任何参数的 git push
,默认只推送当前分支,这叫做 simple
方式。此外,还有一种 matching
方式,会推送所有有对应的远程分支的本地分支。Git 2.0 版本之前,默认采用 matching
方法,现在改为默认采用 simple
方式。如果要修改这个设置,可以采用 git config
命令。
$ git config --global push.default matching
# or
$ git config --global push.default simple
还有一种情况,就是不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机,这时需要使用–all
选项。
git push --all origin
上面命令表示,将所有本地分支都推送到 origin
主机。
推送给多个远程仓库
git remote set-url --add origin https://xxx
git add
git add -u
提交被修改(modified)和被删除(deleted)文件,不包括新文件(new)git add .
提交新文件(new)和被修改(modified)文件,不包括被删除(deleted)文件git add -A
提交所有变化(git add --all
的缩写)
git reset
index 也被称为 staging area ,是指一整套即将被下一个提交的文件集合。
git add -A
便是将当前修改文件加入 staging area 。
–mixed
默认方式,回退到某个版本,只保留源码,回退 commit 和 index 信息。
–hard
彻底回退到某个版本,本地源码变为上一个版本内容。
–soft
回退到某个版本,只回退 commit 的信息,保留 index 信息。 譬如如果还要提交,直接 commit 即可。
git stash
git stash clear
: 清除暂存
Cheat sheet
# 设置当前 git 用户名与邮箱
git config user.name "simimi" && git config user.email "me@simimi.cn"
git rebase
Bash
# 放弃 rebase
git rebase --abort
To Be Continued.