特有名词解释
DETACHED HEAD
HEAD normally refers to a named branch (e.g. master). Meanwhile, each branch refers to a specific commit.
HEAD 通常指的是一个已被命名的分支(如master).但同时每一个分支可以指向一个具体的提交。DETACHED HEAD 意味着HEAD游标指向一个具体的commit而非某个被命名的分支。(it means simply that HEAD refers to a specific commit, as opposed to referring to a named branch. )
在这种状态下,一般会出现这个问题:Your branch and 'origin/master' have diverged 需要如下新建分支合并分支的方法解决:
git branch my-temporary-work
git checkout master
git merge my-temporary-work
为什么要设立一个暂存区的概念
工作区、版本库、暂存区原理图便于小步提交。比如你本地改到一半,有个紧急的 bug 需要修复。你不想将改到一半的东西 commit 进去。所以先 stash 一下,改掉 bug 并 commit,然后 stash pop 出来继续没完成的工作。
小步提交对于维护大型项目很有意义,方便跟踪每一步发生了什么追踪问题。
代码比对
git diff
仅仅是比较 unstaged 的代码和 staged 的代码的区别。untracked 的代码必须先 track.
提交文件
git commit
-a 参数只对修改或删除的文件会自动加到暂存区,对新增文件(untracked)文件无效
-v (--verbose)推荐使用 -v 代替 -m 因为这样可以更好地书写多行 commit message
--amend 修改上一次的 commit message。注意如果是上一次修改已经提交,可能会出现 Your branch and 'origin/master' have diverged 的问题。
删除未监视文件 (untracked files)
建议加上 -n 参数(表示 dry-run)不直接删这些文件而是来先看看会删掉哪些,防止重要文件被误删。
git clean -nf
删除 untracked files
git clean -nfd
连 untracked 的目录也一起删掉
用于保存和恢复工作进度
git stash
意义: Stash(隐藏) the changes in a dirty working directory away
stash是临时保存文件修改内容的区域。stash可以暂时保存工作树和索引里还没提交的修改内容,您可以事后再取出暂存的修改。
注意:stash 的信息为各个分支公用,以栈数据结构存储信息。
git stash save "message..." 保存工作进度 (简写版:git stash)
git stash list 显示进度列表
git stash pop (stash@{0}) 参数表示第几个存储的状态
git stash drop 删除最后一个存储状态,在遇到 stash merge 冲突时经常使用(一般先解决合并冲突,然后 git stash drop )
git stash clear 清空
操作流程:保存工作进度→完善紧急的修改→stash pop继续之前没完成的工作
[stash 储藏](https://git-scm.com/book/zh/v1/Git-%E5%B7%A5%E5%85%B7-%E5%82%A8%E8%97%8F%EF%BC%88Stashing%EF%BC%89)
回退回滚
git reset——针对本地仓库的文件的撤销
git reset 是变更某分支 HEAD 游标位置的命令。
git reset <文件所在路径>
将 staged 状态的文件变为 unstaged 状态。
git reset --hard HEAD~2
将 HEAD 游标回退两个版本。
git reset --hard <commitID>
:将当前分支重置为指定版本。(提交版本号commitID通过git log
查看)。应用场景:当你解决完冲突,并且在合并完成后发现一个错误,你仍然还是有机会来简单地撤销它。你只须要键入 “git reset --hard ” 命令
git revert——针对远程仓库 commit 的撤销
git revert 用于撤销已存在的 commit ,并且会创建一个新的提交,是一种安全的做法。
reset VS revert
reset 是在正常的 commit 历史中,删除了指定的 commit ,这时 HEAD 是向后移动了。而 git revert 不会改变现在的提交历史,它是在正常的 commit 历史中再 commit 一次,他的 HEAD 是一直向前的。
因此,git revert 可以用在公共分支上,git reset 应该用在私有分支上。你也可以把 git revert 当作撤销已经提交的更改,而 git reset HEAD 用来撤销没有提交的更改。
分支管理
git branch
-
git branch
查看当前 checkout 过哪些远程分支,并且会标明当前所在分支。 -
git branch -v
除以上功能外还会显示分支的最后提交记录。 -
git branch --remote
查看远程库有那些分支 -
git branch <分支名>
创建某分支。和git checkout -b
区别在于不切换到该分支。 -
git branch -d <分支名>
删除某分支(必须保证目前不处于该分支)(注意这一步仅仅是删除本地分支,远程分支删除还得用 git push) -
git branch -m <old-branch> <new-branch>
重命名分支(变更分支名)
git checkout
-
git checkout -f 目标文件(夹)所在目录
强行覆盖本地的文件(夹)
①若修改后仍未放到缓存区,则恢复到上一次git commit的状态。
②若添加到缓存区后又做了修改,恢复到上一次git add的状态。 -
git checkout -b <分支名>
创建并切换到该分支,等价于git branch <分支名> + git checkout <分支名>。
tag管理
git push origin --tags
把本地版本推送到了远程代码仓库
如果刚刚同步上去,你缺发现一个致命bug ,需要重新打版本
git tag -d <某个具体版本号,如V1.2>
这一步只是删除了本地 V1.2的版本,可是线上V1.2的版本还是存在
这时我们可以推送的空的同名版本到线下,达到删除线上版本的目标:
git push origin :refs/tags/V1.2
配置设置
git config
git对大小写敏感
git 默认对文件名大小写不敏感 (不区分文件名大小写)
git config core.ignorecase false
为指定命令配置一个别名,可快速输入命令。
git config --global alias.命令别名 命令
例如
git config --global alias.st status
:使用git st代替git status
查看公钥
cat ~/.ssh/id_rsa.pub
,注意查看是否有空格之类的,否则公钥不正确。
远程仓库操作
如何将一个已存在的目录转换为一个 GIT 项目并托管到 GITHUB 仓库?
http://leonshi.com/2016/02/01/add-existing-project-to-github/
git remote
查看全部远程仓库详细地址:
git remote -v
查看当前远程仓库地址:git remote -v(这个在不确定当前是fork的代码还是人家的代码时很有效)
对远程仓库进行操作:
git remote add <远程仓库名> <远程仓库地址>
多人协作开发,需要相互添加远程仓库。(这个具体怎么运作去实际单位实践一下应该就知道了)
git remote rm <远程仓库名>
当某个开发者不再贡献代码的时候就可以删除他对应的远程仓库了。
删除远程仓库的分支:git push origin --delete develop1
(删除远程仓库origin的develop1分支,等价于git push origin :develop1
)
git pull
git pull
= git fetch
+ merge to local
(有时候git pull会出现落后于远程仓库的问题,所以先fetch)
提交日志
git log
按照时间顺序显示所在分支的提交日志git log -g
(这是为了避免代码回滚带来的影响。不加-g的提交日志和远程仓库的commit信息是保持一致的。但是如果有代码回滚操作,回滚位置之前的commit logs信息就看不到了)
查看提交日志git log --pretty=oneline
(整洁版本)
解决冲突
git merge
git merge master feature
将master分支合并到feature分支 等价于
git checkout feature //切换到feature分支
git merge master // 将master分支合并进feature分支
git merge --abort
仅仅在合并后导致冲突时才使用。将会抛弃合并过程并且尝试重建合并前的状态。
其他
利用gitmoji-cli 来提交带有 emoji 的commit
gitmoji -i
Initialize gitmoji as a commit hook,这样每次 commit 会自动打开
gitmoji 提示
gitmoji -r
Remove a previously initialized commit hook
gitmoji -c
交互式提交
git pgp签署工作
必须首先安装gpg(GnuPG)(一般用 HomeBrew )
gpg --gen-key
先生成自己的密钥
生成密钥的时候还遇到问题,后来依靠其中的 Thumb 解决。
pgp 签署工作
参考:http://www.ruanyifeng.com/blog/2013/07/gpg.html
疑惑
git pull --rebase
做了什么?我的detached HEAD状态解除了
参考文献
Git远程操作详解(有幅图片很棒)
https://github.com/geeeeeeeeek/git-recipes/wiki/
http://www.worldhello.net/gotgit/index.html
bitbucket git教程
网友评论