感谢廖雪峰老师的分享。传送门
1.利用git创建目录
在本地创建版本库,在合适的地方,这是在E盘下。pwd 命令用于显示当前的目录(如果你使用Windows系统,为了避免遇到各种莫名其妙的问题,请确保目录名(包括父目录)不包含中文。) image.png2.升级成git管理仓库
通过 git init 把此目录编程git管理仓库
瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),细心的读者可以发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
此时你可以在生成的目录下新建自己的文件了。
3.文件的提交
首先可以用git status 查看状态,在主分支。用 git add 名字添加文件
image.png 本地修改了文件内容,用git status 查看,提示readme.txt被修改过了,但还没有准备提交的修改。git diff 查看修改的内容 image.png 再进行文件的提交,此时提交到暂存区。 image.png 在Git中,我们用git log命令查看: image.png 可以查看提交记录。嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数: image.png 需要友情提示的是,你看到的一大串类似3628164...882e1e0的是commit id(版本号),和SVN不一样,首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD,上上一个版本就是HEAD,当然往上100个版本写100个比较容易数不过来,所以写成HEAD~100。 image.png 想要恢复版本怎么办?4.版本的回滚
只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个append GPL的commit id是3628164...,于是就可以指定回到未来的某个版本 image.png版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
管理修改-----修改 add ,修改 提交 == 修改 add 修改 add 提交
5.撤销修改
git checkout -- readme.txt 撤销
6.删除文件
一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm命令删了:rm test.txt检查状态的时候发现: image.png 现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit: image.png 另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本$ git checkout -- tet.txt
命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
7.远程控制
由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置所以要添加shh
ssh-keygen -t rsa -C "youremail@example.com"
github上创建新的仓库之后:
如果遇到提示: image.png 移除,重新添加
image.png 下一步,就可以把本地库的所有内容推送到远程库上: image.png 把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
从现在起,只要本地作了提交,就可以通过命令:
git push origin master
修改了本地,添加到暂存区,提交,推送到远程 image.png SSH警告
当你第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告:
The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established. RSA key fingerprint is xx.xx.xx.xx.xx. Are you sure you want to continue connecting (yes/no)?
这是因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes回车即可。
Git会输出一个警告,告诉你已经把GitHub的Key添加到本机的一个信任列表里了:
Warning: Permanently added 'github.com' (RSA) to the list of known hosts.
这个警告只会出现一次,后面的操作就不会有任何警告了。
如果你实在担心有人冒充GitHub服务器,输入yes前可以对照
GitHub的RSA Key的指纹信息 是否与SSH连接给出的一致。
=================
要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git;关联后,使用命令git push -u origin master第一次推送master分支的所内容;此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;
8:版本克隆
在电脑其他地方创建一个文件夹(目的让clone的learngit不与本地的重复) ,在gitbash中进入该目录 image.png 输入指令,克隆我们learngit。此时在github上是有这个仓库的。 image.png 本地E盘下就克隆好了总结:要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。
Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。
9.分支管理
创建和合并分支 image.png image.png image.png实战=============================================
git branch dev
git checkout dev
9.1查看分支 image.png
当前分支会标记一个*号,然后对文件进行了修改,添加文字XXXX。提交 image.png 此时 图例就像下面一样,主分支中没有文字XXXX,因为还在分支中。 image.png ,然后我们切换到主分支可以查看 image.png 本地readme.txt中确实没有新加的文字XXXX。接下来我们合并分支9.2合并分支 image.png
git merge命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。当然,也不是每次合并都能Fast-forward,我们后面会讲其他方式的合并。 image.png删除后,查看branch,就只剩下master分支了
9.3总结
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
10.解决冲突 image.png
创建了分支dev1,添加了内容,切换到主分支也添加了内容。图例就像这样子 image.png合并会产生冲突,必须手动解决冲突后再提交 image.png 用 git status 可查看
image.png 在文件中我们也能看见
image.png 在手动解决了冲突之后,改成下面的样子 image.png
然后在 添加到暂存区 ,并提交 image.png 此时的关系图就是如下 image.png 最后删除分支dev1。 image.png 这样子就解决了冲突。
最后可以推送到远程 image.png 当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
用git log --graph命令可以看到分支合并图。
11.分子策略管理
合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。 image.png如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
12.bug分支
软件开发中,bug就像家常便饭一样。有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,但是,等等,当前正在dev上进行的工作还没有提交:
并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?
幸好,Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
$ git stash
12.1首先确定要在哪个分支上修复bug,假定需要在master分支上修复,就从master创建临时分支: image.png image.png
bug解决完了,就继续工作
工作区是干净的,刚才的工作现场存到哪去了?用git stash list命令看看:
$ git stash list
stash@{0}: WIP on dev: 6224937 add merge
工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了:
删除之后,用 git stash list 就看不到内容了
你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:
$ git stash apply stash@{0
小结
开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。
13.多人协助工作
当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。
13.1推送分支
推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:
$ git push origin master 推送到远程主分支
$ git push origin dev 推送到远程dev分支
但是,并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?
● master分支是主分支,因此要时刻与远程同步;
● dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
● bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
● feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
总之,就是在Git中,分支完全可以在本地自己藏着玩,是否推送,视你的心情而定!
13.2抓取分支
多人协作的工作模式通常是这样:
- 首先,可以试图用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。
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
13.3标签管理
标签也是版本库的一个快照。
请把上周一的那个版本打包发布,commit号是6a5819e...不好找
请把上周一的那个版本打包发布,版本号是v1.2,这样子根据v1.2就可以绑定了
方法是找到历史提交的commit id
eg:
$ git log --pretty=oneline --abbrev-commit
6a5819e merged bug fix 101
cc17032 fix bug 101
7825a50 merge with no-ff
6224937 add merge
59bc1cb conflict fixed
400b400 & simple
75a857c AND simple
fec145a branch test
d17efd8 remove test.txt
比方说要对add merge这次提交打标签,它对应的commit id是6224937,敲入命令:
git tag v0.9 6224937
小结
● 命令git tag <name>用于新建一个标签,默认为HEAD,也可以指定一个commit id;
● git tag -a <tagname> -m "blablabla..."可以指定标签信息;
● git tag -s <tagname> -m "blablabla..."可以用PGP签名标签;
● 命令git tag可以查看所有标签。
13.4操作标签
删除标签 image.png 因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。如果要推送某个标签到远程,使用命令git push origin <tagname> image.png 一次性推送全部的本地的标签$ git push origin --tags如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除eg: image.png
从远程删除
git push origin :refs/tags/v1.0
● 命令git push origin <tagname>可以推送一个本地标签;
● 命令git push origin --tags可以推送全部未推送过的本地标签;
● 命令git tag -d <tagname>可以删除一个本地标签;
● 命令git push origin :refs/tags/<tagname>可以删除一个远程标签。
13.5github相关
小结
● 在GitHub上,可以任意Fork开源仓库;
● 自己拥有Fork后的仓库的读写权限;
● 可以推送pull request给官方仓库来贡献代码。
13.6忽略特殊文件
git add -f App.class 强制添加
你发现,可能是.gitignore写得有问题,需要找出来到底哪个规则写错了,可以用git check-ignore命令检查:
$ git check-ignore -v App.class
总结:
● 忽略某些文件时,需要编写.gitignore;
● .gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理
配置别名,让命令更简洁
比如:git config --global alias.st status
git st === git status
配置文件放哪了?每个仓库的Git配置文件都放在.git/config文件中
git服务器配置
网友评论