基本操作
工作区 --> 暂存区 git add .
,撤销 git rm --cached .
暂存区 --> HEAD git commit
, 对最近一次提交修改注释 --amend
工作区 --> HEAD git commit -a
HEAD --> 工作区 git reset --head
(清空工作区、暂存区)用于pull、rebase等操作后的恢复
远程仓库
列出远程仓库 git remote -v
列出远程仓库详细信息git remote show [remote-name]
添加git remote add origin [url]
origin就是一个别名,默认叫origin
删除 git remote rm [remote-name]
重命名git remote rename old-name new-name
分支
查看本地分支及追踪的分支git branch -vv
查看本地、远程分支git branch -av
切换分支
git checkout master
git checkout origin/master
git将当前分支上修改的东西转移到新建分支
第一种方法
在A分支修改完成后,不用做commit,只需要在A分支新建B分支,然后切换过去。
这个时候你会发现修改的东西在A,B分支都有。
这个时候在B分支commit,那么这些修改保留在B分支上,再切换到A分支上会发现修改都没有保留下来。
第二种方法
使用git stash 将A分支暂存起来,然后在某一个分支(如master分支)新建一个分支B,然后在B分支上使用git stash pop 将修改弹出到B分支上,然后这些修改就在B分支上了。
创建本地分支
在本地创建一个新分支,该分支可是是从当前分支上检出的,也可是从远程分支检出的。
-b 创建成功后,自动切换至新分支上。git checkout -b 新本地分支名
git checkout -b 新本地分支名 origin/远程分支名
-b create and checkout
创建远程分支
git branch orgin/远程分支名
也可以通过“推送”创建
HEAD detached
’detached HEAD’,即现在HEAD指向的是一个没有分支名字的修订版本,“游离”于已知的所有分支之外。所以游离HEAD的问题就在于它没有一个具体的分支名,git branch temp 最近的commitId
将HEAD指向的commit命名为分支temp,然后切换到分支master上,执行merge命令git merge temp
,最后删除临时分支git branch -d temp
2. 文件提交后,push到远程服务器
git remote -v 查看远程仓库地址
git remote add 远程仓库名origin 远程仓库地址
git branch --set-upstream-to=origin/<branch> master 设置远程跟踪,设置本地分支master跟踪origin/<branch>远程分支
git push --set-upstream 远程仓库名 远程分支名
远程服务器的文件可能在你push前已经变动了,这种情况下再提交会不成功:
解决1:
git pull
远程文件到本地。= fetch+merge
git checkout --track origin master -b localName
获取远程分支master 到本地新分支localName,并跳到localName分支
--track,让创建的本地分支localName追踪的远程分支中远程的origin/remoteName分支。
避免本地仓库分支和远程仓库分支并未进行关联,即本地分支未追踪到远程分支。
情况1):
远程变动的文件与你修改的文件不是同一文件,pull后不会影响你的修改的文件
比如新加了文件的情况:
情况2):
远程变动的文件正好是你改了的文件,pull后会自动merge
然后再看看你修改的文件会有出现<<<<<<< HEAD、=======、>>>>>>>
HEAD和=号之间表示你本地文件的内容,
=号和>>>>>>>之间表示要合并的内容(别人改的),后面也会接分支名称。
你需要根据情况修改下文件最后再删除那些符合,最后后 add 、 commit 、 push即可
需要注意的是:
有的时候pull下来,会覆盖你修改的文件,所以git pull操作前还是先stash。
解决2:
git push -f
强制推送。但服务器上的文件若有冲突,会以冲突形式显示
推送
git push origin master
git push --set-upstream origin 本地分支名:远程分支名
同时设置了跟踪
将本地分支push到远程,并建立远程同名分支
git push -u origin 本地分支名
-u 即 --set-upstream 的简写
case
创建了一个 temp 分支,做了一些修改后,使用git push origin master提交,但是显示的结果却是'Everything up-to-date',发生问题的原因是git push origin master 在没有track远程分支的本地分支中默认提交的 master 分支,因为 master 分支默认指向了origin master 分支,这里要使用git push origin temp:master 就可以把 temp 推送到远程的master分支了。
$ git push origin master
Everything up-to-date
$ git push origin master -f
Everything up-to-date
$ git push origin temp:master
就好了
减少提交次数
$ git commit --amend --no-edit
# --amend 修改最新的一次 commit,将现在 staged change 直接添加到上一次 commit 去,不生成新的 commit
# --no-edit amend 的提交不修改提交信息
变基
rebase
为了确保在向远程分支推送时能保持提交历史的整洁,可以使用rebase来合并分支,而不是merge
case:剔除远程分支中的某个或某几个连续的提交
git rebase -i 前一个提交
pick改为drop,然后按照提示保存退出
参考:
变基,剔除某个提交
https://blog.csdn.net/Nathan1...
注意,这个操作会不仅造成修改的提交以及它的下一个提交改变提及号。
case:合并最近的 3个提交
git rebase -i HEAD~4
把不要的两个(比较新的,在下方的)的pick改为fixup,然后按照提示保存退出
参考:https://www.cnblogs.com/zhaoy...
case:修改commit注释
amend可以修改最后一次commit信息,但对于历史提交信息,也需要使用rebase命令。
参考
使用git push -f origin branch_name
可以更新远程仓库的提交信息,注意,如果是协同开发最好不要这样。
https://git-scm.com/book/zh/v...
比较
工作区与暂存区文件比较: git diff --文件名
暂存区与HEAD比较:git diff --cached
多个提交间的比较:git diff 提交1 提交2 -- 文件名1 文件名2
多个分支之间的比较: git diff 分支1 分支2
恢复
工作区变回暂存区内容:git checkout --文件名
暂存区变回HEAD:git reset HEAD -- 文件名1 文件名2
工作区变回HEAD: git reset --hard 提交号(这样有些危险!工作区、暂存区会被清空!)
rebase后的恢复
其他:
git reflog
# 和 git log 的区别,它不仅仅是提交的记录,还有其他git的操作记录
# 对应的记录号
# 7b6e4f8 HEAD@{0}
# e7d2c90 HEAD@{1} 等等
git reset HEAD@{index}
删除对应的commit
git revert [2feb45f]
存储stash
不用提交,直接 git stash name1
再git status
发现工作区里修改的内存好像没了,其实是存储在一个栈空间里了,git stash list
可查看,使用git stash apply name1
或git stash pop name1
即可取出,
标签
git tag v1 //建立标签
git tag -a v1 -m '建立标签'
git show v1 //查看标签版本信息
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。