记录 Git 的一些常用指令与问题解决方案。


ref



常用指令


拉取代码



远程仓库



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 中,用 HEAD 表示当前版本,,上一个版本就是 HEAD^,上上一个版本就是 HEAD^^,当然往上 100 个版本写 100 个^比较容易数不过来,所以写成 HEAD~100。


--hard 会包括当前源码回到上次状态。

保留当前更改,只回退 commit 信息可使用 --soft

清除缓存区中准备提交的内容,只保留修改的状态,可不加参数,或使用 --mixed



More Info


分支管理



清除缓存



Example: git rm -r --cached .


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


参见:http://blog.csdn.net/iefreer/article/details/7679631


提交至 GitHub 时出现 invalid-email-address



git config --global user.name "用户名"
git config --global user.email "Git账户邮箱"



GitHub Fix invalid email address in Repository History


合并两个不同的项目,出现错误



参见:http://blog.csdn.net/lindexi_gd/article/details/52554159


删除已经上传至 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 修改已提交的内容 - CSDN


修改之前已经上传的提交


修改方法一


git rebase -i HEAD~1   #当前版本的倒数第一次状态



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.
#


修改方法二


# 修改需要修改的地方(只是修改 commit message 就不用做)
git add . #这一步如果只是修改 commit message 不用输入
git commit --amend
# 输入修改后的 commit message,保存



git push <remote> <branch>
# Example: git push origin add-something


修改方法三


找到想要修改的 commit 的父 commit id



pick 578ba7a hexo backup
...


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 工具 - 子模块


清除本地修改


git clean  -d  -fx



详解


git push



上面命令表示,将本地的 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 主机。


参见: http://www.yiibai.com/git/git_push.html


推送给多个远程仓库


git remote set-url --add origin https://xxx


git add



git reset


git reset | Git Docs


index 也被称为 staging area ,是指一整套即将被下一个提交的文件集合。


git add -A 便是将当前修改文件加入 staging area 。


--mixed


默认方式,回退到某个版本,只保留源码,回退 commit 和 index 信息。


--hard


彻底回退到某个版本,本地源码变为上一个版本内容。


--soft


回退到某个版本,只回退 commit 的信息,保留 index 信息。

譬如如果还要提交,直接 commit 即可。


To Be Continued.