学习廖雪峰的Git教程笔记
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
一、安装git
(1)linux 可直接yum install git
(2)windows 可从官网下载安装程序,https://git-scm.com/downloads
安装完成后,设置
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
二、创建版本库
(1)切换到保存版本库的目录,如 cd /e/weicy/phpstudy/www/learngit
(2)通过git init
命令把所在目录变成Git可以管理的仓库 (勿动生成的.git
隐藏文件)
(3)添加文件到仓库
git add <file>
,如:git add test.txt
。
添加当前目录所有文件和文件夹git add .git commit -m "message"
,-m后面输入的是本次提交的说明,如:git commit -m "第一次提交"
commit可以一次提交很多文件,所以你可以多次add不同的文件,比如:
git add file1.txt
git add file2.txt file3.txt
git commit -m "add 3 files."
三、版本间切换
(1) git reset --hard HEAD^
(在Git中,用HEAD
表示当前版本,上一个版本就是HEAD^
)
(2) git reset --hard <commit_id>
,直接指定切换到的commit_id,commit_id写4位数以上
辅助命令
- git status 命令,仓库当前的状态,可知道哪些文件被修改过
- git diff 命令,查看修改内容
- git log 命令,查看从最近到最远的提交日志,简化输出内容可加参数
git log --pretty=oneline
,加参数--abbrev-commit
缩略commit_id,q
退出日志 - git reflog 查看命令历史,以便确定要回到未来的哪个版本
四、工作区/暂存区 概念
为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件。
git add 把文件添加进去,实际上就是把文件修改添加到暂存区;
git commit 提交更改,实际上就是把暂存区的所有内容提交到当前分支。
每次修改,如果不用git add到暂存区,git commit时就不会把修改加入到分支版本库中。
五、撤销修改
把工作区的修改撤销
git checkout -- <file>
,如:git checkout -- test.txt
,这里有两种情况:
一种是 test.txt 自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是 test.txt 已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
把在暂存区的修改撤销(unstage),重新放回工作区
git reset HEAD <file>
,如:git reset HEAD test.txt
,
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。
删除文件
一般情况下,用git rm <file>
命令删了,并且git commit
和
先手动在工作区删除文件,然后使用git rm <file>
和git add <file>
效果是一样的。
删错了,版本库里还有,可以 git checkout -- <file>
,还原文件。
六、远程仓库
创建SSH Key
ssh-keygen -t rsa -C "youremail@example.com"
邮件地址换成自己的邮件地址,一路回车,使用默认值即可。
如果顺利,可在用户主目录里找到.ssh目录,里面有 id_rsa
和 id_rsa.pub
两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
在GitHub 添加公钥
登陆GitHub,打开账户“settings”,“SSH and GPG keys”页面
然后,点“New SSH key”,填上任意Title,在Key文本框里粘贴id_rsa.pub
文件的公钥
推送到远程仓库
关联一个远程库,使用命令
git remote add origin git@github.com:weicy1510/learngit.git
其中 weicy1510
GitHub账户名, learngit.git
仓库名字,origin
远程仓库的名称(可自定义)
关联后,使用命令 git push -u origin master
此后,就可以使用命令 git push origin master
推送
把本地库的内容推送到远程,用 git push
命令,实际上是把当前分支master推送到远程。第一次推送master分支时,加上了-u
参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联
起来,在以后的推送或者拉取时就可以简化命令。
从远程库克隆
首先必须知道仓库的地址,然后使用git clone
命令克隆,如:
git clone git@github.com:weicy1510/learngit.git
多人协作
查看远程库信息,使用git remote -v
在本地创建和远程分支对应的分支,使用git checkout -b <branch-name> origin/<branch-name>
,本地和远程分支的名称最好一致;
多人协作的工作模式通常是这样:
(1)首先,可以试图用git push origin <branch-name>
推送自己的修改;
(2)如果推送失败,则因为远程分支比你的本地更新,需要先用git pull
试图合并;
(3)如果合并有冲突,则解决冲突,并在本地提交;
(4)没有冲突或者解决掉冲突后,再用git push origin <branch-name>
推送就能成功!
如果git pull提示no tracking information,则说明远程分支和的本地分支链接关系没有创建,用命令git branch --set-upstream-to=origin/<branch-name> <branch-name>
。
六、分支管理
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
如要删除一个没有被合并过的分支,可通过git branch -D <name>
强行删除。
解决冲突
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
Git用<<<<<<<
,=======
,>>>>>>>
标记出不同分支的内容
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交(git add <file>
、git commit -m "message"
)。
用git log --graph
命令可以看到分支合并图。
如:
git log --graph --pretty=oneline --abbrev-commit
合并分支时,加上--no-ff
参数就可以用普通模式合并(强制禁用Fast forward模式),Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息,
如:合并dev分支
git merge --no-ff -m "merge with no-ff" dev
-m
后的双引号是说明描述
分支策略
在实际开发中,应该按照几个基本原则进行分支管理:
首先,master
分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
干活都在dev
分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
团队每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
所以,团队合作的分支看起来就像这样:
Bug分支
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash
一下,然后去修复bug,修复后,再git stash pop
,回到工作现场。
如有多个stash,恢复的时候,先用git stash list
查看,然后恢复指定的stash,用命令:
git stash apply stash@{0}
七、标签管理
命令git tag <tagname>
用于新建一个标签;
命令git tag
可以查看所有标签。
命令git push origin <tagname>
可以推送一个本地标签
命令git push origin --tags
可以推送全部未推送过的本地标签;
命令git tag -d <tagname>
可以删除一个本地标签;
命令git push origin :refs/tags/<tagname>
可以删除一个远程标签。
八、忽略特殊文件
在Git工作区的根目录下创建一个特殊的.gitignore
文件