git笔记

git是目前最先进的分布式版本控制系统

一.集中式VS分布式

1.集中式:版本库是集中放在中央服务器的,而干活的时候是用自己电脑,先从中央服务器获取最新版本,然后工作。工作完毕,推送给中央服务器

2.分布式:分布式系统中根本没有“中央服务器“,每个人的电脑上有一个完整的颁布,工作的时候不必联网,因为版本库就在本机

二.Windows上安装Git

百度搜索git,下载国内镜像就可以,直接安装就可以

安装完成,鼠标右键Git Bash Here,进行设置

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

三.创建版本库

1.选择一个合适的地方,创建一份空目录

$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit

pwd:显示当前位置

2.将这个目录变成git可以管理的仓库

$ git init
3.新建一个文件,如何加入git仓库?

(1)git add 文件名

(2)git commit -m "备注"

当我们成功提交了一份文件,我们可以使用 git status 查看仓库当前的状态。同样我们可以使用git diff 查看文件具体被修改了什么内容。

四.版本退回修改,撤销,删除

1.版本退回 git reset

使用git log 命令可以用于查看提交历史,以便确定好退回到哪一个版本,显示的顺序是最近到最远提交的日志

git log --pretty=oneline 格式控制,前面的一串表示commit id,红色部门表示版本号

$ git log --pretty=oneline
<span style="color:#ff0000;">3628164</span>fb26d48395383f8f31179f24e0882e1e0 append GPL
ea34578d5496d7dd233c827ed32a8cd576c5ee85 add distributed
cb926e7ea50ad11b8f9e909c05226233bf755030 wrote a readme file

HEAD表示当前版本,HEAD^表示上一个版本,HEAD^^表示上上个版本

git reset --hard HEAD^  退回到上一个版本

git reset --hard 3628164   退回到某一个版本

注意:要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本

2.版本退回 gitcheckout --file

如果你不小心改错了文件,如果还没有进行add,commit,可以很容易修改,因为文件修改过后还没有放到暂存区,现在撤销就回到和版本库中一模一样的状态

如果已经添加到暂存区,可以使用git checkout --file

注意:git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令

场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file

场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。

场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。

3.删除文件

正常情况下在文件管理器中将没有用的文件删除了,可以使用rm 文件,此时git 知道你把文件删除了,可以使用git status查看删除了那些文件

如果确定要从版本库中删除该文件:git rm 文件,再commit

如果不小心删除错了,可以从版本库中恢复:git checkout --文件

五.远程仓库

1.创建SSH Key

$ ssh-keygen -t rsa -C "youremail@example.com"
如果一切顺利的话,可以在用户主目录里找到 .ssh 目录,里面有 id_rsa id_rsa.pub 两个文件,这两个就是SSH Key的秘钥对, id_rsa 是私钥,不能泄露出去, id_rsa.pub 是公钥,可以放心地告诉任何人

2.登录GitHub

找到Settings,Add SSH Key,添加任意title在key里面粘贴:id_rsa.pub文件的内容

    3.添加远程仓库

    在git上创建一个仓库,名字就是自己本地仓库的名字就可以,如何将本地仓库与远程库关联?

添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。

$ git remote add origin git@github.com:michaelliao/learngit.git

使用git push -u orgin master,把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。

由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

注意:SSH警告

当你第一次使用

$ git merge --no-ff -m "merge with no-ff" dev

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.

这个警告只会出现一次,后面的操作就不会有任何警告了

4.从远程库克隆 git clone

$ git clone git@github.com:michaelliao/gitskills.git

六.分支管理

1.创建合并分支:

(1)创建分支:git checkout -b dev ,其中-b表示创建并切换,相当于先git branch dev,再git checkout dev

(2)查看当前分支:git branch

(3)合并分支:git merge dev,合并的模式是:快进模式

(4)删除分支:git branch -d dev

2.解决冲突

当两个分支上都对某个文件进行了修改,合并的时候会有冲突,先手动解决冲突,在提交,合并。git log --graph命令可以看到分支合并图

3.分支管理策略

分支合并的时候,git会用fast forward模式,这种模式下,删除分支后,会丢掉分支信息,可以强制禁用fast forward 模式,这样git在merge会生成一个新的commit,这样可以从分支历史上看出分支信息

$ git merge --no-ff -m "merge with no-ff" dev
4.Bug分支

当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。

修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;

总结:

(1)--no-ff:不使用fast-forward方式合并,保留分支的commit历史

(2)--squash:使用squash方式合并,将多次分支commit历史压缩为一次


5.Feature分支

添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。如果要丢弃一个没有被合并过的分支,可以通过git branch -D <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 <name>用于新建一个标签,默认为HEAD,也可以指定一个commit id;

    • git tag -a <tagname> -m "blablabla..."可以指定标签信息;

    • git tag -s <tagname> -m "blablabla..."可以用PGP签名标签;

    • 命令git tag可以查看所有标签。

      • 命令git push origin <tagname>可以推送一个本地标签;

      • 命令git push origin --tags可以推送全部未推送过的本地标签;

      • 命令git tag -d <tagname>可以删除一个本地标签;

      • 命令git push origin :refs/tags/<tagname>可以删除一个远程标签。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值