git踩坑记
总是容易忘记 git 的一些命令和用法,在此记下我重复 google 的,哈哈,比较无序,足够多时再分类。
credentials helper
将文件移除监听队列
git 中如果文件已被加入跟踪队列,后续添加相应的.gitignore 参数时其相应的改变仍会被监听,采用如下
git rm --cached XX/xx.x
常见的 git 删除
git rm XXX.xx
如果误删了可采用git checkout
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区修改还是删除,都可以使用此还原
新增远程仓库地址
git add remote [<options>] <name> <url>
//例子
git add remote origin https://github.com/snowyYU/x.git
name 为远程主机的名字
push,push,push
git push -u origin master
这里只想说一下-u 参数,设置了这个之后,pull fetch push 啥的默认连接的为 origin master
1 | git push origin --all |
上面命令表示,将所有本地分支都推送到 origin 主机。如果远程主机的版本比本地版本更新,推送时 Git 会报错,要求先在本地做git pull合并差异,然后再推送到远程主机。这时,如果你一定要推送,可以使用 –-force 选项。
1 | git push origin --tags |
git push 不会推送标签(tag),除非使用 -–tags 选项
pull,pull,pull
tag
打上标签
主要有两种方法
git tag tagNamegit tag -a tagName -m "remarks备注"
查看tags
1 | git tag // 只会显示标签命 |
从 tag 处开一个分支
git branch <new-branch> <tag-name> 进行版本的管理
删除标签
在 Git v1.7.0 之后,可以使用这种语法删除 tag
1 | git push origin --delete tag <tagName> |
另一种删除 tag 的方法,推送一个空 tag 到远程 tag:
1 | git tag -d <tagName> |
log 和 reflog 命令
git log
展示所有的 commit
git reflog
展示所有的操作记录,相较 git log ,reflog 命令可以展示 reset 和已删除 commit 的操作
merge
分支间的合并操作
对于 merge 之后会不会产生合并快照需要注意几点
- 合并的两个分支是否在分叉后同时产生各自的快照,如果是,则会产生合并快照,否则即为 快进合并
merge 错误记录
今天在 pull 时出现了一个问题,过程是这样的,我新建了远程仓库时顺带初始化了 readme,结果本地 pull 时报错,如下
fatal: refusing to merge unrelated histories
就是它觉得我两个仓库没啥关联,然后我尝试 push,报错如下
$ git push -u origin master
To https://github.com/snowyYU/center-solution.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/snowyYU/center-solution.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
说我本地仓库版本过时啦,叫我先 pull
没办法,只能强上了,加上参数
git pull origin master --allow-unrelated-histories
之后会进入 vim 让我输入 commit message,
撤销合并
1 | git merge --abort |
有时候拉代码,合并,结果整个文件到处是冲突,可以使用此命令撤销到合并前的状态
一般这种情况常见于仓库和本地工作环境有一端代码格式化不同步
处理合并冲突
正常情况下可以通过 IDE 自带的冲突处理工具完成,不过需要手动处理每一个冲突
如果想无脑使用当前分支或者 incoming 状态的分支来处理冲突,可以参照如下
1 | git checkout branchA |
详情见 Is there a “theirs” version of “git merge -s ours”?
查看更改处
git diff [<options>] [<commit> [<commit>]] [--] [<path>...]
上图:

这样只会对比当前工作区和所在分支最新 commit 的改动处,需要对比远程分支,可以看 参考链接
查看单独一个文件的修改历史
1 | 1. git log filename |
查看加入暂存区或者处于 stash 状态下文件的变更
1 | git diff --cached filename |
撤销更改
如果还没有使用 add 命令加入到暂存区,可以
单个文件
1 | git checkout --filename |
所有文件
1 | git checkout . |
清除所有新增未加入暂存区的文件/文件夹
1 | git clean -xdf |
注意:-x 会清除掉 .gitignore 文件中的忽略文件,比如常见的 node_modules 文件
详情见 Here’s How to Clean Git and Remove Untracked Files
还有 掘金,查看删除列表
如果已经 add 之后,想要撤销
单个文件
1 | git reset HEAD filename |
所有文件
1 | git reset HEAD |
如果已经 commit 了,想要撤销
1 | git reset commit_id // 撤销后所有的更改会变成 add 之前的状态,git status 之后就是一片红红红 |
这个 id 是你想要回到的那个节点,可以通过 git log 查看,可以只选前 6 位
或者 通过 gitreflog 命令取得
1 | git reset --hard commit_id //撤销之后,所做的已经commit的修改将会清除,仍在工作区/暂存区的代码也将会清除! |
创建,切换分支 ,删除
今天在看 webpack 官网的指南时候,发现各部分练习的代码挺不一样,又想起之前看 angularjs 时官网给出的 phonecat,他们项目各个构建步骤被创建成一个个 branch,感觉十分方便,所以我仿照试下
git checkout -b XXX
这个命令相当于
git branch XXX //新建XXX分支
git checkout XXX //切换到XXX分支
现在就切换到 XXX 分支了,可以在 gitbash 中看到,然后我直接
一般情况下直接 clone 的项目只有 master 分支,想要获取远程别的分支代码还需要在本地检出一个分支,然后建立映射,这两步可以使用一条命令完成
1 | git checkout -b 本地分支名 origin/远程分支名 |
特殊特殊的情况下,可以参照如下
其实此时远程仓库中并没有 XXX 分支,执行此命令后,远程仓库会新建 XXX 分支,并 push 成功。
1 | git push origin XXX |
删除本地的 XXX 分支
1 | git branch -D XXX |
删除远程的 XXX 分支
1 | #方法一 |
直接删除远程的默认分支会不成功,可以先设置别的分支为默认分支,然后再删除
git rebase
自己尝试更新 folk 到自己 github 上仓库时查到的这个命令,先上个链接
第一个答案大意就是,
- 从自己的 GitHub 上 clone 至本地工作目录
- 在本地添加 remote,即从哪 folk 来的(这里先叫 upstream),
- fetch upstream 上的所有分支
- 切换到本地的 master 分支
- 将 upstream 上需要同步的分支 rebase
我觉得 rebase 和 merge 差不多,区别可能是 rebase 不会留下痕迹,merge 需要输入 message 啥的
git stash
哈哈,这个命令还挺好玩的,能把当前工作区的更改先搁置,最常见的应用就是突然要去到之前的某个版本打个包。
使用 git stash pop 取回搁置的更改,继续撸码
如果更改中有 untrack 的文件,需要加上
-u参数,即git stash -u才能一起 stash 起来
后续
针对更新自己 folk 的仓库,官方后来又给出了 web 版本的方案,上面的是需要本地仓库的,先上链接
大致就是自己从源向自己 folk 的仓库发起 pull request,然后合并
遇到 ping github.com time out 问题
可以在网页中正常访问 github,唯独在终端中连接不了 github,也 ping 不通
喵喵喵?查了半天网上说了一堆关于 proxy 代理的问题,结果我连到手机的热点就可以了,所以下次遇到时尝试切换网络环境