Git说明
Git属于分布式版本控制系统,相对于SVN等集中式版本控制系统有很多优势。
工作本地有一个完整的版本库,这样工作的时候不联网的情况,也可以控制版本。
工作区(Working Directory) -- 当前的工作目录
版本库(Repository) -- .git文件夹
版本库中内容:
1.暂存区stage(或者叫做index),通过git add命令添加
2.master分支,以及指向master分支的HEAD,通过git commit命令添加到当前分支。
Git本地使用介绍
① 版本库创建
gitinit
作用在本地创建.git目录用来跟踪管理版本库。
② 把文件添加到版本库
gitadd filenames
通过以上命令将文件添加到本地索引,用于下次的commit
gitcommit -m “commit log”
根据之前add的本地索引,向版本库提交文件。
③ 变更上传
git status
查看版本库当前的状态
git diff
查看具体变更内容
git add filenames
通过以上命令将文件添加到本地索引,用于下次的commit。
Git跟踪管理的是修改,并非是文件,同一文件多次修改的情况下,每次修改后都需要先用git add命令添加到index,不然修改无法提交。
gitcommit -m “commit log”
根据之前add的本地索引向版本库提交文件,可以add多次,再整体的commit。
④ 版本回退
git log
查看变更的历史记录
git log --pretty=oneline
让履历行显示
git reset --hard HEAD~
回退到上一个版本,上上一个版本是 HEAD~~ 前N个版本 HEAD~N
⑤ 版本回退之后再回退回来
git reflog
查看历史命令,显示commit_id
git reset --hard commit_id
通过commit_id 可以确定回到哪个版本
⑥ 丢弃工作区的修改
git checkout -- filename
将filename文件在工作的修改全部撤销。
一种是文件自修改后没有放到index暂存区,现在,撤销修改就回到版本库一模一样的状态。
一种是文件已经添加到index暂存区,又做了修改,现在撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最后一次git commit 或git add时的状态。
git checkout .
用来一次撤销全部修改
⑦ 撤销index暂存区
git reset HEAD file_name
撤销掉index暂存区,重新放回工作区。
使用方法⑥丢弃工作区的修改。
⑧ 删除文件
git rm filename
git commit -m “Log message”
从版本库里删除文件
本地文件误删除的场合,参照⑥
⑨ 备份当前工作区的内容
git tash
从最近的一次提交中读取相关内容,让工作区保证和上次提交内容没有冲突,同时将当前工作内容保存到Git栈中。
git stash list
显示Git栈内的所有备份
git tash pop
从Git栈中读取最近一次保存的内容,回复到工作区。并且将保存内容从Git栈删除。
git stash clear
清空Git栈
git stash apply stash_name
恢复指定的stash,不删除Git栈内容
git stash drop stash_name
删除指定的stash。
Git远程操作介绍
① 从服务器克隆到本地
git clone
使用 git://这样的路径,默认的使用ssh协议,加密,速度比较快。
② 查看远程库的信息。
git remote
通过命令git remote -v 可以显示更详细的信息。
③ 推送分支
git push server_name branch_name
一般情况本地的master分支是主分支,因此要和远程同步。
其他本地分支是否需要和服务器同步视情况而定,如果不推送到远程,对其他人是不可见的。在Gti中,分支完全可以在本地自己藏着玩,是否推送,视心情而定。
④ 抓取远程的新提交
git pull
如果pull失败,本地分支和远程分支不关联的情况,使用以下命令:
git branch -a 查找远程分支
git branch --set-upstream-to=远程分支
⑤ 获取远程提交解决冲突
git pull 成功但是合并有冲突,需要手动解决本地冲突,
然后提交,再push
⑥ 从本地创建和远程分支对应的分支
git checkout -b branch_name Server/branch_name
Git分支管理
Master分支为主分支,指向提交的。
HEAD指向当前分支。
一开始IDE时候,master分支是一条线,Git使用master指向最新的提交,再用HEAD指向master,确定当前分支以及当前分支的提交点,
创建新的分支,Git创建了一个新的指针dev,指向master相同的提交,然后HEAD指向dev,表示当前分支在dev上
之后的提交,会提交到HEAD指向的当前分支
假如当前dev分支上的工作完成了,dev合并到master上
合并分支时候,如果可能,Git会用Fast forward模式,这种模式下,删除分支后,会丢掉分支信息。如果强制禁用Fast forward模式,Git会在merge时生成一个新的commit,这样分支历史上就可以看出分支信息。
删除分支,就是直接删除分支的指针。
分支的冲突,当在两个分支上分别作了不同的修改之后,试图合并两个分的时候,可能会有冲突。
分支冲突的场合需要手动差分解决冲突。
① 创建分支,然后切换到分支
git checkout -b branch_name
相当于一下两条命令
git branch branch_name
git checkout branch_name
② 查看当前分支
git branch
列出所有分支,当前分支前面会有一个*
③ 切换分支
git checkout branch_name
④ 合并分支
git merge branch_name
合并分支先要迁移到想要合并到的目标分支上,使用上述命令将想要合并的分支合并到当前分支上。
⑤ 普通模式合并
git merge --no-ff -m"Merge LOG" branch_name
本次合并需要创建一个新的commit,所以加上-m参数,把commit描述写进去。
⑥ 解决冲突
git merge命令使用完了后,如果存在冲突的话会提示COFLICT信息。
必须手动解决冲突后再提交。
git status 命令也可以告诉冲突的文件。
冲突文件内会Git会用 <<<<<< . ========.>>>>>>>标记出不同的分支的内容。
修改后通过 git add , git commit 提交后会解决掉冲突。
通过命令 git log --graph--pretty=oneline --abbrev-commit 可以查看合并的log
⑦ 删除分支
git branch -d branch_name
删除分支的时候不能删除当前分支,即HEAD指向的分支不能被删除。
如果要删除一个没有被merge过的分支,需要使用强行删除命令。
git branch -D branch_name
分支策略
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先master分支应该非常稳定,也就是仅用来发布新版本,平时不能在上面干活;
工作都在dev分支上,也就是说,dev分支是不稳定的,到某时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支上发布1.0版本;
TAG
① 创建tag
git tag tag_name
通过git checkout 命令切换到需要打tag的分支上,然后使用以上命令就可以打tag
② 查看所有tag
git tag
③ 使用commitID打tag
git tag tag_name cimmitID
使用命令git log --pretty=oneline --abbrev-commit查看commitID。
④ 查看tag详细信息
git show tag_name
⑤ 创建tag提交comment
git tag -a tag_name -m “commentmessage” commitID
⑥ 创建使用PGP签名的tag
git tag -s tag_name -m "commentmessage" commitID
⑦ 删除tag
git tag -d tag_name
⑧ 向服务器提交tag
git push server_name tag_name
也可以使用git push server_name --tags一次性提交所有没有提交的本地tag
⑨ 删除服务器的tag
首先删除本地的tag然后使用命令 gitpush server_name :refs/tags/tag_name
配置别名
git config --global alias.st status
上述命令可以简化输入,以后st就可以表示status