发表于: 2017-04-20 16:31:42
2 724
通过阮一峰的git日志,学习到了git的知识点并做以下笔记:
所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。
不幸的是,Microsoft的Word格式是二进制格式,因此,版本控制系统是没法跟踪Word文件的改动的,前面我们举的例子只是为了演示,如果要真正使用版本控制系统,就要以纯文本方式编写文件。
一、命令行
安装完成后:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
1.先创建再通过命令行添加
cd 路径
创建一个版本库: mkdir learngit
初始化一个Git仓库,使用git init命令。
使用我们指定目录作为Git仓库git init filename
添加文件到Git仓库,分两步:
第一步,使用命令git add <file>,注意,可反复多次使用,添加多个文件;
第二步,使用命令git commit,完成。
$ git add 文件名 //添加
$ git commit -m "描述修改的内容" //提交
2.git status 查看仓库状态(比如是否有需要提交的,是否有修改..)
git diff 文件名 查看文件修改前后内容,可以知道自己最后一次到底修改了什么
然后再添加提交
(-----执行 git diff 来查看执行 git status 的结果的详细信息。
git diff 命令显示已写入缓存与已修改但尚未写入缓存的改动的区别。git diff 有两个主要的应用场景。
尚未缓存的改动:git diff
查看已缓存的改动: git diff --cached
查看已缓存的与未缓存的所有改动:git diff HEAD
显示摘要而非整个 diff:git diff --stat----)
3.git log 查看历史修改记录,默认显示三条
可以试试加上--pretty=oneline参数:显示比较简洁
bad2e7203ae87f9301c1bbd0556fe1cad73560f7 add GRL //bad2e7203ae87f9301c1bbd0556fe1cad73560f7为版本号
39b3571d6c10c9908c12c1534c9c8434bf625236 add distributed
9cd8afbd48a568a2f0fee4916e10e5f089c6e774 wrote a readme file
4.版本退回:git reset --hard HEAD^
上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
回到上一个版本之后,使用git log 上一个版本就已经没有了,在还没有关闭控制台时
可以用($ git reset --hard 版本号前几位 )就可以找回
当你用$ git reset --hard HEAD^回退到add distributed版本时,再想恢复到append GPL,就必须找到append GPL的commit id。Git提供了一个命令git reflog用来记录你的每一次命令:
5. cat 文件名 查看文件内容
6.撤销修改
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节
7.删除文件 (rm 文件名)
7-1:如果真的要删除就确认删除并提交 git rm filename
7-2:如果是不小心删除:($ git checkout -- 文件名)
注意:命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
8.远程仓库:
8-1. 首先注册一个GitHub账号,
8-2. 由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置:
第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ git-keygen -t rsa -C "1214840825@qq.com" 需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即
第二步:登录GitHub,进入settings(设置) - SHH and GPG keys(添加公钥)
然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容
远程仓库创建完毕
8-3 添加远程库
现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作
8-3-1 第一步:登录GitHub,找到+列表下的New repository,创建git库
$ git remote add origin git@github.com:michaelliao/learngit.git //关联远程库
(git remote rm origin --- 用来解除关联)
然后把本地库的所有内容推送到远程库上:
$ git push -u origin master //推送 master 分支
把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
推送成功后,可以立刻在GitHub页面中看到远程库的内容已经和本地一模一样:
从现在起,只要本地作了提交,就可以通过命令:
$ git push origin master
9.上面讲的是现有本地仓库,后有远程仓库,如何关联远程库;现在我们从零开发,那么最好的方式是先创建远程库,
然后,从远程库克隆
9-1: 第一步:先登录GitHub,创建一个库
第二步:远程库创建好之后,用git clone 克隆一个本地库 git clone git@github.com:pcxweb/mywarehouse.git
10.分支管理
10-1:创建和合并分支:
Git鼓励大量使用分支:
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
10-2 解决冲突(在创建的分支和master分支上同时提交修改地方相同但内容不同的文件),
合并之后需删除分支
git log --graph --pretty=oneline --abbrev-commit(查看合并情况)
10-3 分支管理策略
通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
下面我们实战一下--no-ff方式的git merge:
准备合并dev分支,请注意--no-ff参数,表示禁用Fast forward:
$ git merge --no-ff -m "merge with no-ff" dev
Merge made by the 'recursive' strategy.
readme.txt | 1 +
1 file changed, 1 insertion(+)
11.bug分支:
git stash (存储功能)当正在某个分支(dev)工作,还没法提交,但是突然接到一个
修复一个代号101的bug任务,需要暂停正进行的工作时,可以先存储,重新创建分支issue-101修复bug
修复完成后删除该分支,然后继续回到之前工作分支(dev),用git stash list 查看之前工作现场
git把stash内容存在某个地方,需要进行恢复:
两种方法:1.用git stash apply,该方法恢复后,stash内容不删除,用git stash drop删除
2.git stash pop 恢复同时删除stash内容)
12.feature 分支
开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除
13 多人协作
模拟多人协作:可以在另一台电脑(注意要把SSH Key添加到GitHub)或者同一台电脑的另一个目录下克隆:
同一台电脑: git clone git@github.com:pcxweb/learngit.git
必须创建远程origin的dev分支到本地: git checkout -b dev origin/dev(前提必须库有dev分支)
(在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;)
从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
查看远程库信息:git remote 或 git remote -v(更详细)
推送分支:git push origin master/(其他分支)
抓取分支:当有小伙伴在你之前修改了同一个分支同一个文件并提交,你提交的时候就会提示冲突
于是你需要 用git pull 把最新的提交从origin/dev抓取下来,然后合并,解决冲突,再推送,
在git pull之前需要指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接:
(git branch --set-upstream dev origin/dev),再git pull最后推送
建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;
从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。
14. 标签管理:
git log --pretty=oneline --abbrev-commit(查看所有修改版本号)
14-1. 创建标签 $ git tag v1.0(标签名)注:在commit提交之后打标签
给之前版本添加标签 git tag v0.9 6224937(版本号)
查看标签:git tag (标签安装字母顺序列出,而不是时间顺序)
git show v0.9 查看标签信息
14-2. 创建带有签名的标签:用-a指定标签名,-m指定说明文字:
git tag -a v0.1 -m "version 0.1 released" 3628164
14-3. 还可以通过-s用私钥签名一个标签git tag -s v0.2 -m "signed version 0.2 released" fec145a
签名采用PGP签名,因此,必须首先安装gpg(GnuPG)如果没有找到gpg,或者没有gpg密钥对,就会报错:
如果报错,请参考GnuPG帮助文档配置Key。
用命令git show <tagname>可以看到PGP签名信息:用PGP签名的标签是不可伪造的,因为可以验证PGP签名。验证签名的方法比较复杂
14-4. 操作标签:
删除标签:git tag -d v0.1 创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。
推送标签到远程,使用命令git push origin <tagname>:
一次性推送全部尚未推送到远程的本地标签:git push origin --tags
删除已经推送到远程库的标签:$ git tag -d v0.9
$ git push origin :refs/tags/v0.9
15.使用GitHub:
可以访问它的项目主页https://github.com/twbs/bootstrap,点“Fork”就在自己的账号下克隆了一个bootstrap仓库,然后,从自己的账号下clone:git clone git@github.com:michaelliao/bootstrap.git
一定要从自己的账号下clone仓库,这样你才能推送修改。如果从bootstrap的作者的仓库地址git@github.com:twbs/bootstrap.git克隆,因为没有权限,你将不能推送修改。
16.自定义Git :
git配置颜色:$ git config --global color.ui true
17.忽略特殊文件:
(在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。)
你想添加一个文件到Git,但发现添加不了,原因是这个文件被.gitignore忽略了:
$ git add App.class
The following paths are ignored by one of your .gitignore files:
App.class
Use -f if you really want to add them.
如果你确实想添加该文件,可以用-f强制添加到Git:
$ git add -f App.class
或者你发现,可能是.gitignore写得有问题,需要找出来到底哪个规则写错了,可以用git check-ignore命令检查:
$ git check-ignore -v App.class
.gitignore:3:*.class App.class
Git会告诉我们,.gitignore的第3行规则忽略了该文件,于是我们就可以知道应该修订哪个规则。
18.配置别名: $ git config --global alias.st status =》git status = git st
$ git config --global alias.co checkout => co =checkout
$ git config --global alias.ci commit => ci = commit
$ git config --global alias.br branch => br = branch
--global参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用。
$ git config --global alias.last 'log -1' =>git last =git log -1(查看最后一次提交)
配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。
每个仓库的Git配置文件都放在.git/config文件中:$ cat .git/config
当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中: cat .gitconfig //用户主目录
19.搭建git服务器:
20.在GitHub的修改更新在本地:
第一步:git fetch origin 更新
第二步:git merge origin/master 将更新同步到本地
21删除远程仓库
删除远程仓库你可以使用命令:
git remote rm [别名]
实例
$ git remote -v
origin git@github.com:tianqixin/runoob-git-test.git (fetch)
origin git@github.com:tianqixin/runoob-git-test.git (push)
# 添加仓库 origin2
$ git remote add origin2 git@github.com:tianqixin/runoob-git-test.git
$ git remote -v
origin git@github.com:tianqixin/runoob-git-test.git (fetch)
origin git@github.com:tianqixin/runoob-git-test.git (push)
origin2 git@github.com:tianqixin/runoob-git-test.git (fetch)
origin2 git@github.com:tianqixin/runoob-git-test.git (push)
# 删除仓库 origin2
$ git remote rm origin2
$ git remote -v
origin git@github.com:tianqixin/runoob-git-test.git (fetch)
origin git@github.com:tianqixin/runoob-git-test.git (push)
http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html
评论