git的学习

一、从创建版本库走出第一步

1.首先,选择一个合适的地方,创建一个空目录:mkdir learngit(目录名)目录最好不要有中文

进入该目录:cd learngit

pwd可以查看该目录

2.通过git init命令把这个目录变成Git可以管理的仓库

3.添加文件到版本库,如添加read.txt.

先用git add read.txt将文件传到暂存区

再用git commit -m"注释”将文件传入仓库

我们的操作都是在工作区执行,然后将文件传到暂存区,最后才会到仓库

注:git status可以查看仓库当前的状态

如果文件有修改,status会告诉你,但并不能看到修改,git diff read.txt就是可以告诉你修改内容,防止自己忘了上次的修改。

二、版本回退以及管理

1.在你多次修改提交文件后发现错了想要读档回到之前的状态,commit每次执行后都会有记录,而我们就可以通过这个记录进行版本回退

git log可以查看到你的提交记录如:

commit e7bee9d959aaa3ca8758abaeced69c20185aa71b (HEAD -> master)
Author: cn <chenn@zhongmakj.com>
Date:   Tue Aug 21 17:16:39 2018 +0800

    brancg

commit 5e95555ec8bf25e820171b7bb77782fad2548344 (origin/master)
Author: cn <chenn@zhongmakj.com>
Date:   Tue Aug 21 15:12:41 2018 +0800

    remove

commit fcf31b38bf0f2d7082d069efefb29948a320035b
Author: cn <chenn@zhongmakj.com>
Date:   Tue Aug 21 15:11:54 2018 +0800

    add

commit d52f9062b783e1d09d7d33950c232107758b7402
Author: cn <chenn@zhongmakj.com>
Date:   Tue Aug 21 14:48:11 2018 +0800

    add test.txt

加上--pretty=oneline参数可以让记录简洁一点如

$ git log --pretty=oneline
e7bee9d959aaa3ca8758abaeced69c20185aa71b (HEAD -> master) brancg
5e95555ec8bf25e820171b7bb77782fad2548344 (origin/master) remove
fcf31b38bf0f2d7082d069efefb29948a320035b add
d52f9062b783e1d09d7d33950c232107758b7402 add test.txt
c79165f744ff745efdd8ec861424a403d86eb5c6 remove test.txt
3f68383ee7fdd64d7bc7e9a7fb0682b6108bd5a1 add test.txt
8b2c14bb5392947e82b73dc4e0e53f42fe2bad60 gut tracks changes
550cce8ec9f61101a45a4a4cb72dcb9bb77b3cbe understand how stage works
b575b30a303c5e407b3b6612d726c2b191b1f754 append GPL
6b92e7a8b6a30143d27158427fdb4cb63b4d65bc wrote a readme file

我们的回退用的是git reset命令

git reset --hard HEAD^是回退到上个版本,HEAD^^就是上两个版本,HEAD~100就是上100

也可以通过版本号进行准确的版本变动git reset --hard d52f90(版本号不需要打全,但也不能太少)

如果回退到了上版本且关掉了命令行,可以通过git reflog找到版本号,该命令记录了你的每一次命令。

2.管理修改

git管理的是修改而不是文件,假设你改动了文件,但没有add到暂存区就直接commit,然后再用status查看状态,就会发现修改没有提交。

注:通过git diff HEAD -- readme.txt可以查看工作区和版本库里面最新版本的区别。

3、撤销修改

通过命令git checkout -- readme.txtreadme.txt文件在工作区的修改全部撤销

在这里有两种情况

一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

而如果你已经将文件提交到了暂存区,就可以用git reset HEAD read.txt把暂存区的修改回退到工作区(HEAD表示最新的版本),然后再撤销工作区的修改。

而如果以及提交到仓库了,就用版本回退解决。

4、删除文件

rm read.txt删除文件或手动删除文件后,用status可以看到那些文件被删除了

如果是误删,可以git checkout --read.txt恢复,因为版本库里还保存着

还有就是删掉版本库里的这个文件,通过git rm read.txt,然后再commit实现

 三、远程仓库

GitHub提供Git仓库托管服务的,所以,只要注册一个GitHub账号,就可以免费获得Git远程仓库。

第1步:创建SSH Key:ssh-keygen -t rsa -C "youremail@example.com"。如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsaid_rsa.pub两个文件

第2步:登陆GitHub,打开”settings“,“SSH Keys”页面:

然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容

第3步:登陆GitHub,然后,在右上角找到“new repository”按钮,创建一个新的仓库,在Repository name填入learngit,其他保持默认设置,点击“Create repository”按钮

第4步:在本地运行git remote add origin git@github.com:你自己的GitHub账户名/learngit.git,让远程仓库与本地仓库关联

第5步:将本地仓库的内容推送到远程仓库中:git push -u origin master这是第一次推送,让两个仓库的master分支也关联起来,之后可以直接用git push origin master推送。

然后就是通过git clone git@github.com:你自己的GitHub账户名/gitskills.git就可以从远程仓库中克隆gitskills.git,获取到gitskills目录及里面的内容。

四、分支管理

1.你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向mastermaster才是指向提交的,所以,HEAD指向的就是当前分支。

通过git checkout -b dev可以创建新的分支dev并切换到该分支

git checkout -b dev等同于

git branch dev

git checkout dev两个命令

git branch可以查看当前分支

在该分支上我们可以对read.txt进行正常的修改和提交

然后切换会master分支会发现read.txt的修改没了,这时就要用到git merge dev进行分支合并。

最后就可以用 git branch -d dev删除分支

2.但有时候,分支合并时会有冲突,如在两个分支上都做了修改并提交,这个时候再合并就可能会冲突

Git告诉我们,readme.txt文件存在冲突,就必须手动解决冲突后再提交,即进入read.txt文件进行修改。

3.合并时git merge --no-ff -m "merge with no-ff" dev,就可以用普通模式合并,分支就不是一条线,而是多条分支,在合并的时候有有连接。

4.开发时遇上bug,但在dev分支上的工作还没完成,但要先修复bug,就可用git stash,将当前的工作先隐藏起来

然后确定要在哪条分支上修复bug,就先切换到那条分支,在创建修复bug用的分支,bug修复后就提交然后合并分支

再回到dev分支继续工作,用git stash list,可以看到你之前隐藏的工作

你可以通过两个方式恢复

一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;

另一种方式是用git stash pop,恢复的同时把stash内容也删了

当然你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:git stash apply stash@{0}

5.如果要丢弃一个没有被合并过的分支,可以通过git branch -D <分支名>强行删除。

6.用git remote -v可以查看远程库的信息

如果你和队友一起推送分支,就可能失败,这就需要用git pull抓取提交(如果提示no tracking information,就说明本地分支和远程分支没有建立连接用git branch --set-upstream-to <branch-name> origin/<branch-name>本地和远程分支的名称最好一致;

pull成功后,在本地合并,解决冲突,再推送。

7.rebase的使用

rebase操作可以把本地未push的分叉提交历史整理成直线;

rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。

缺点是本地的分叉提交已经被修改过了

五、标签管理 

标签tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起。

git tag name可以创建标签,默认标签是打在最新提交的commit上

如果想打在之前的commit上,就先用log找到历史的commit id,在再加到git tag name后面即可

git tag可以查看所有标签(标签不是按时间顺序列出,而是按字母排序的)

可以用git show <tagname>查看标签信息如git show v0.9

还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字: git tag -a v0.1 -m "version 0.1released"1094adb

git tag -d v0.1可以删除标签,而如果已经推送到远程再删就要现在本地删除再git push origin :refs/tags/v0.9这样才能删除远程标签

如果要推送某个标签到远程,使用命令git push origin <tagname>

也可以用git push origin -- tags将所有未推送的本地标签推送

六、自定义git

配置别名git config --global alias.st status 这表示用st表示status

每个仓库的Git配置文件都放在.git/config文件中

当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig

有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件

在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,再将该文件提交到Git,Git就会自动忽略这些文件。

如忽略了.class后,再用git add aaa.class会发现添加不了

如就是要加就用git add -f aaa.class强行添加

如果发现可能.gitignore有问题,就可以用git check-ignore -v aaa.class命令检查

posted @ 2018-08-22 18:42  14宁  阅读(122)  评论(0编辑  收藏  举报