同一份文件,a修改一次,b修改一次,git可以很方便的合并修改,也能方便的记录每个文件的改动
版本1 文件名 说明
1 test.doc 增加了
2 test.doc 删除了
集中式,每次都是从中央服务器获得最新版本,修改再放回中央服务器
分布式,每个人电脑都是完整版本库,只需推送自己修改即可
git status查看库状态,git diff 文件名,查看修改
git add 文件名 提交修改,git commit -m "addtest"提交
查看每次提交的哈希码,git log,简化输出信息git log --pretty = oneline
git reset --hard HEAD^回退到上个版本,上上个版本HEAD^^,上100个版本HEAD~100,上一个版本HEAD~1
或者git reset --hard 1094e前5位,或者前7位哈希码,写前几位都可以,2、3位也是可以的,但为了避免冲突,一般5个到7个
如果回退到过去版本,再想回到新版本,可以查看记录新版本的哈希码,如果控制台关闭了,看不到了,或者git reflog查看每一次命令提交的哈希码,每次提交就相当于一个存档点
git仓库有一个工作区和一个版本库,.git目录就是git的版本库,第一个分支是master,stage是暂存区,指向master的指针是HEAD
工作区的内容会add到暂存区,commit会一次性提交到分支上,每次提交都要附带说明,附加信息
如果修改,add,再次修改,提交,那么提交不会保存再次修改的内容的,需要再次add到暂存区
撤销暂存区的修改,当增加了不必要的修改时,即从暂存区将修改的文件去除掉
git reset HEAD 文件名 reset可以回退版本,也可以回退暂存区到工作区
git checkout --文件名 丢弃工作区的修改
git checkout实际上是将版本库的文件替换工作区里的文件
从版本库删除文件git rm 文件名,再提交,文件就从版本库里删除了,把误删的文件恢复到最新版本,git checkout --文件名
一个分支你在学习svn,另一个分支你在学习git,合并起来于是你全部都学会了
只有一个master分支的版本库就是一条直线,增加了dev分支,除了更改HEAD指针的指向,工作区的任何文件都没有变,在dev上的工作完成了,就可以合并,将dev合并到master上
创建并切换到dev分支上,git checkout -b dev
相当于git branch dev和git checkout dev
查看分支git branch,在dev分支上修改并提交,切换位mater分支(git checkout master)发现刚才提交的内容不见了,因为那个提交再dev分支上,master分支提交的内容并没有改变
将dev合并到master分支,git merge dev
合并完成后,就可以放心的删除dev分支了,git branch -d dev
实际上切换分支用switch更加直观,git switch -c dev创建并切换分支,git switch master切换至master分支
假如两个分支对同一个地方进行了修改
<<<<<<<HEAD
内容1
=======
内容2
>>>>>>>分支1
只需把<<<<<<<到>>>>>>>的内容删除,修改位内容21即可,手动解决冲突后,再次提交即可,也就是说在实际工作中,一般不会有两个人同时修改同一个地方比如同一个函数的可能性存在
合并分支用--no--ff,就会产生一次新的提交,而不单单是合并分支,默认是用Fast forward模式,这样删除分支后,就会丢失分支信息
git merge --no--ff -m "devhb" 合并dev分支
master分支用于发布新版本,每个人都在dev分支上干活,每个人都有自己的分支,时不时往dev分支上合并就可以了
git修复bug,git stash将工作区暂时冷冻起来,在dev分支上冷冻起来,切换至master分支,创建临时分支,git checkout -b issue-101,提交,切换至mater分支,合并分支,最后回到dev分支,查看工作现场git stash list
用git stash apply恢复,但需要用git stash drop删除储藏stash的内容,或者git stash pop恢复同时删除了stash的内容
多次stash的话,恢复指定的stash,git stash apply stash@[0]
就是说你在dev分支上有修改,但是不希望dev分支上的修改也同时提交到master上,就可以将dev分支上工作区的内容冷冻起来
dev上的bug来自于master,于是dev上也有bug,如何将master的bug应用到dev,需是所在dev分支上
git cherry-pick 4c305e2 修复bug那次提交的哈希码,即 issue-101分支所提交的哈希码
没有合并的分支无法被删除,删除需要用大写的-D,而不是小写-d
git checkout -D 分支名
远程库
关联一个远程库,把已有的本地仓库与远程库关联
git remote add origin github.com:mia/learngit.git
推送mater分支的所有内容
git push -u origin master
每次提交后,都可以用git push origin master推送,也可以是累积起来,一次提交
远程库的名字默认是origin,是默认的,也可以更改为其他名字
克隆远程库git clone 远程地址
他克隆仓库,在本地创建了dev分支,时不时把dev分支推送push到远程,你在某一天碰巧也对同样的文件同样的地方做了修改,你推送失败,所以用git pull把最新更新从origin上抓下来,在本地合并,解决冲突,再提交
pull失败的话,是没有指定本地dev与远程origin/dev分支的链接,设置dev与origin/dev的链接,git branch --set=upstream-to -origin/dev dev
如果pull提示no tracking information则本地分支与远程分支没有关联
查看远程库信息git remote,git remote -v显示更详细的信息
git push origin master git push origin dev
master需要时刻与远程库同步,dev也要与远程库同步
bug分支没必要推送,除非别人要看到你修复了多少个bug,feature分支是否需要推送,取决于你和小伙伴是否合作开发,分支完全可以自己隐藏着玩
和远程库同步后,我们进行了两次提交,本地比远程库快两步,有人先我们push,我们pull一下,现在本地快远程三个提交,但是提交历史分叉了
用git log查看,如果现在把本地分支push到远程里,有问题,不好看
可以用git rebase,这样本地提交变成一条直线了,rebase能把分叉的历史纪录整理成一条直线
git tag v1.0 把标签打在最新一次的提交上
git tag v0.9 f52c653 给提交的那次哈希码,打标签
git tag查看所有的标签
git log --graph --pretty=oneline -abbrev-commit查看所有的提交
git view v0.9查看标签信息
git tag -a v0.1 -m "taginfo" 1094adb 创建带有说明的标签
删除标签git tag -d v0.1
推送标签到远程git push origin v01
git push origin --tags推送所有的标签
删除远程标签git tag -d v0.9 远程删除git push origin :refs/tags/v0.9
合作别人的仓库,需要fork到自己的账户里,在github里发起一个pull request,即可提交自己仓库的分支到别人的仓库
github.com的速度慢是最大的问题,不满意可以使用gitee.com
.gitignore这个文件是忽略名单,在这个里面的文件名,将不会被提交到暂存区
th.db
desktop.ini
*.py[cod]
*.so
dist
则.pyc,.pyo,pyd包括dist目录,和th.db,desktop.ini都不会被添加到暂存区
强制提交
git add -f app.class
git check-ignore -v app.class 查看哪个规则忽略了这个文件的提交
配置别名
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch
以后提交就可以简写为
git ci -m "bala bala bala..."
把暂存区的修改撤销掉,重新放回工作区
git config --global alias.unstage 'reset HEAD'
执行git unstage test.py实际上执行的是git reset HEAD test.py
显示最近一次提交的信息
git config --global alias.last 'log -1'
git last
更有人把lg配置为了,使得查看信息更加的方便
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
git lg
每个仓库的Git配置文件都放在.git/config文件中
$ cat .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[remote "origin"]
url = git@github.com:michaelliao/learngit.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[alias]
last = log -1
而当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中:
[alias]
co = checkout
ci = commit
br = branch
st = status
[user]
name = Your Name
email = your@email.com
配置别名也可以通过修改这个文件
实际上我们配置用户名和邮箱,包括配置别名等,加--global都是配置当前用户,而不是只是该仓库
例如配置用户名和邮箱
git config --global user.name "test"
git config --global user.email "test@163.com"
git的服务器配置不讲,会另开一篇文章,就是设置git的中央服务器的,使得git管理团队,设置git中央服务器,在linux下操作
git的客户端软件推荐SourceTree,可以图形化操作git,比git自带的用着方便和舒服的多,是一款免费的git图形化工具