Git 学习
注:本笔记是学习廖雪峰老师官网的Git的心得。写得非常不错!推荐学习。
配置
git config --global user.name "Your name"
git config --global user.name "Your email"
-- global 表示整个系统上的git仓库都会用这个配置,当然,某个仓库也可以指定用户和email。
创建版本库
总的就两个步骤:
-
初始化一个git仓库 git init命令
-
添加文件就两步:
-
git add < filename >
-
git commit
-
$ mkdir learngit
$ cd learngit
$ git init #初始化仓库,创建好后,会出前一个.git的文件夹
# 将某个文件添加到git仓库
$ git add readme.txt
$ git commit -m "wrote a readme file" # -m 后面的是提交文件的说明
# commit可以提交多个文件
查看状态
git status 查看仓库状态
git diff 查看本地文件和仓库文件不同
版本回退
每一个版本修改了什么,我们有时候会记不清
这个时候我们就可以使用命令git log来显示我们的历史记录
当然我们也可以添加 --pretty=oneline来删减我们的信息。
在git中我们使用HEAD表示当前版本,上一个版本就是HEAD,上上个版本就是HEAD^,当有一百个版本时,我们可以使用HEAD~100来表示
具体的回退版本命令,我们可以使用 git reset
- $ git reset --hard HEAD^
-
那么如果是后悔了,想在重新找回先前的版本,怎么办呢?Git提供了一个命令git reflog就可以找到现在需要的版本的id了。这样就可以使用上述的版本调回去了。
文件的撤销修改
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
文件删除
可以用rm删除本地
用git rm 删除仓库,然后提交git commit
远程仓库 ——从本地到远程
一个新的从本地到远程的做法
- >echo "# learngit" >> README.md
- git init
- git add README.md
- git commit -m "first commit"
- git remote add origin https://github.com/luyfuyu/learngit.git
- git push -u origin master
把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
由于远程库是空的,我们第一次推送master分支时,加上了==-u==参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
在这之后,只要本地做了提交,就可以通过命令:
git push origin master
把最新的本地master分支的最新修改推送至Github。
-
要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git;
-
关联后,使用命令git push -u origin master第一次推送master分支的所有内容;
-
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;
-
分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,也就是有没有联网都可以正常工作,而SVN在没有联网的时候是拒绝干活的!当有网络的时候,再把本地提交推送一下就完成了同步,真是太方便了!
从远程到本地的克隆
命令如下: git clone url的方式实现从远程进行克隆。
- fly@fly:~$ git clone https://github.com/luyfuyu/Blog.git
- 正克隆到 'Blog'...
- remote: Counting objects: 6, done.
- remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 6
- Unpacking objects: 100% (6/6), done.
- 检查连接... 完成。
-
Git 分支
创建合并分支
首先,我们创建dev分支,然后切换到dev分支:
- $ git checkout -b dev
- Switched to a new branch 'dev'
=git checkout==命令加上-b参数表示创建并切换,相当于以下两条命令:
- $ git branch dev
- $ git checkout dev
- Switched to branch 'dev'
然后,用git branch命令查看当前分支:
- $ git branch
- * dev
- master
git branch命令会列出所有分支,当前分支前面会标一个*号。
然后,我们就可以在dev分支上正常提交,比如对readme.txt做个修改,加上一行:
Creating a new branch is quick.
然后提交:
- $ git add readme.txt
- $ git commit -m "branch test"
- [dev fec145a] branch test
- 1 file changed, 1 insertion(+)
现在,dev分支的工作完成,我们就可以切换回master分支:
- $ git checkout master
- Switched to branch 'master'
cat readme.txt是看不到我们之前改的内容的
我们可以把dev合并到master命令为:git merge dev
当合并完成后,我们就可以删除分支了,命令:==git branch -d dev
查看分支:git branch
创建分支:git branch
切换分支:git checkout
创建+切换分支:git checkout -b
合并某分支到当前分支:git merge
删除分支:git branch -d
解决分支冲突
当存在冲突时,需要手动解决。
同时可以使用git log --graph来查看分支合并图
分支管理策略
通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
bug 分支
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。
feature 分支
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。
多人协作
因此,多人协作的工作模式通常是这样:
-
首先,可以试图用git push origin branch-name推送自己的修改;
-
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
-
如果合并有冲突,则解决冲突,并在本地提交;
-
没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
小结
-
查看远程库信息,使用git remote -v;
-
本地新建的分支如果不推送到远程,对其他人就是不可见的;
-
从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
-
在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
-
建立本地分支和远程分支的关联,使用 git branch --set-upstream branch-name origin/branch-name;
-
从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。
标签管理
创建标签
小结
-
命令git tag 用于新建一个标签,默认为HEAD,也可以指定一个commit id;
-
git tag -a -m "blablabla..." 可以指定标签信息;
-
git tag -s -m "blablabla..." 可以用PGP签名标签;
-
命令git tag可以查看所有标签。
-
git show < tag > 将会列出详细信息
标签操作
-
如果标签打错了,可以删除
git tag -d < tagname >
-
如果要推送某个标签到远程
git push origin < tagname >
-
或者一次性推送全部tag
git push origin --tags
-
当标签推送到远程后,删除标签会有点麻烦
先删除本地:git tag -d v0.9
然后从远程删除,删除命令也是使用 push
git push origin :refs/tags/v0.9
-
命令git push origin < tagname > 可以推送一个本地标签;
-
命令git push origin --tags 可以推送全部未推送过的本地标签;
-
命令git tag -d < tagname > 可以删除一个本地标签;
-
命令git push origin :refs/tags/< tagname > 可以删除一个远程标签
忽略某些特殊文件
在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
忽略Python编译产生的.pyc、.pyo、dist等文件或目录等等。
# Windows: Thumbs.db ehthumbs.db Desktop.ini # Python: *.py[cod] *.so *.egg *.egg-info dist build # My configurations: db.ini deploy_key_rsa
忽略文件的原则是:
-
忽略操作系统自动生成的文件,比如缩略图等;
-
忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
-
忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
#Git 配置别名
命令:
git config --global alias.st status # 将status简写为别名st
配置Git的时候,加上<--global> 是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。
配置文件放哪了?每个仓库的Git配置文件都放在<.git/config >文件中
别名就在[alias]后面,要删除别名,直接把对应的行删掉即可。
而当前用户的Git配置文件放在用户主目录下的一个隐藏文件<.gitconfig >中