感谢廖雪峰老师的分享。传送门
1.利用git创建目录
在本地创建版本库,在合适的地方,这是在E盘下。pwd 命令用于显示当前的目录(如果你使用Windows系统,为了避免遇到各种莫名其妙的问题,请确保目录名(包括父目录)不包含中文。)
2.升级成git管理仓库
通过 git init 把此目录编程git管理仓库
瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),细心的读者可以发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。

此时你可以在生成的目录下新建自己的文件了。
3.文件的提交
首先可以用git status 查看状态,在主分支。用 git add 名字添加文件






4.版本的回滚
只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个append GPL的commit id是3628164...,于是就可以指定回到未来的某个版本
版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。

第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
管理修改-----修改 add ,修改 提交 == 修改 add 修改 add 提交
5.撤销修改
git checkout -- readme.txt 撤销

6.删除文件
一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm命令删了:rm test.txt检查状态的时候发现:

$ git checkout -- tet.txt
命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
7.远程控制
由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置所以要添加shh
ssh-keygen -t rsa -C "youremail@example.com"
github上创建新的仓库之后:

如果遇到提示:



由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
从现在起,只要本地作了提交,就可以通过命令:
git push origin master
修改了本地,添加到暂存区,提交,推送到远程

当你第一次使用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中进入该目录

总结:要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。
Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。
9.分支管理
创建和合并分支


实战=============================================

git branch dev
git checkout dev
9.1查看分支
image.png
当前分支会标记一个*号,然后对文件进行了修改,添加文字XXXX。提交



9.2合并分支
image.png
git merge命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。当然,也不是每次合并都能Fast-forward,我们后面会讲其他方式的合并。

删除后,查看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,添加了内容,切换到主分支也添加了内容。图例就像这样子

合并会产生冲突,必须手动解决冲突后再提交




然后在 添加到暂存区 ,并提交



最后可以推送到远程

用git log --graph命令可以看到分支合并图。
11.分子策略管理
合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用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操作标签
删除标签

如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除eg:

从远程删除
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服务器配置
网友评论