git 教程(廖雪峰)笔记
- 安装好git for windows,后,打开git-bash,这是一切的开始。
- 新建、初始化仓库并添加提交文本文件到已有仓库:
- 新建仓库:在git-bash里输入
mkdir 仓库名
cd 仓库名
pwd
mkdir 新建文件夹/目录;cd进入某文件夹;pwd 显示当前目录。
至此,创建了新的仓库并命名了仓库,进入到了该仓库并显示当前目录。
- 使用该仓库前应该初始化仓库(reponsitory)用:
git init
写了文本文件之后(要放在仓库名目录或者子目录下,否则git找不到),将它添加到仓库中,分两步:
git add txt文件
git commit -m "评论"
【1】git add <filename>(这个不是最终的提交,但是它可以执行多次再最终提交,相当于保存最新进度,存档) ,注意:filename必须是以.txt或者其他文件类型结尾,如readme.txt。
【2】真正的提交是:git commit -m "<message>"。
在实际工作中,每一次小修改就git add一次,这样关掉程序后,暂存区还可以有你修改后的文件;而确定好、文件不会再有大变动的时候,就git commit -m"评论此次文件版本的特性" 一下,相当于发布了这个文件的一次大变动过后的版本。
注意:
- 修改并查看已提交在仓库的文本文件:
先修改文件。
然后:
git status
git diff
在修改该文本文件之后,输入上述两行操作,再然后重新add和commit两步提交就可以了。
git status 用于查看当前分支状态(显示上次提交之后的活动,如有没有文件未提交、有没有文件在执行此查看命令之前被修改过、添加过、删除过。)(status状态),git status 可以用git commit替代;
git diff用于仔细查看修改的地方。(diff即difference)。
总的来说,修改文件就是下面四步:
修改文件
git status //查看该分支
git diff
git add 文件
git commit -m"我干了些啥。。。"
- 时光穿梭机(回退整个版本):
git reset --hard <commit_id>或者HEAD^ //回退的决定性操作
下面是回退之前的查询操作:
git log //显示历史版本
git reflog //显示历史操作
要想修改文件,直接修改;
然后执行git reset --hard 提交的id,或者head^,它表示是一个版本,head表示当前版本(不一定是最新的,你可能回退过),head^^表示是上上个版本,...head~100表示上一百个版本。
可是commit_id怎么找?用git log可以查看之前所有提交版本历史(不能包括回退之后的版本,显示的版本会减少,相等于回到过去),从而知道之前某个版本的id。
用git reflog可以查看所有提交命令历史,可以回退到任一个版本(就是看着有点乱,但是显示了所有的历史操作,相当于可以回到某一个过去也可以去到自己所在的未来,当然,比自己所在还远的未来是不存在的。)
注:
cat 文本文件名(包括后缀.txt)
这个命令可以显示当前文本文件的内容。
- 暂存区(stage):
首先,git的目录一打开就是工作区,里面主要有重要的文件,和一个隐藏的目录(一个叫.git的文件夹),它就是版本库,记录着每一个文件的每一次版本修改;在版本库里有master分支和指向分支的head指针,以及最重要的暂存区。
master就是一个类似于树的结构(里面保存了每一次的工作区所有文件,也就是每一次版本),指针用于寻找它;
而暂存区,就是git add之后,被修改过的文件就被提交到了暂存区,git commit就是将暂存区里的文件全部提交到了master分支里。
“暂存区就像购物车,没到付款的时候你都不确定购物车里的东西全部都是要的。。。每拿一件商品就付一次款。。。那才麻烦大了”。
注意:
工作区就是可以任意修改文件的地方;
暂存区是待整合、待发布版本的聚合地;
master就是不可修改的历史版本(包括最新版本)。
- 小型时光机(回退总结):
(1)
git reset HEAD <filename.txt>可以将暂存区的该文件撤销到工作区;
git checkout --<filename.txt>可以将工作区该文件的修改撤销。
以上就分别是git add和直接修改工作区文件的逆向操作。
(2)
另外,git commit没有回退操作,只能回退版本(git reset head^或commit_id,将所有flies回退),但是版本库里会有strack(痕迹);
(3)
一旦提交到远程库,由于分布式(GIT)的特性,将不可逆转。
- 删除文件:
ls可以查看所有文件的名字,从而得知文件是否被删
删除文件有三种方法:
(1)直接物理删除哈哈,这时Git是知道文件被删除了的,
只是版本库里的版本和工作区的版本不同步而已,
(想要撤销删除,直接git checkout -m <filename.txt>即可撤销,)
若想真正删除当前版本的该文件,使用
git rm <filename.txt>
git commit -m "delete the filename.txt",
该版本就不存在该文件了。
(2)rm <filename.txt>,相当于物理直接删除,
(撤销操作一样)
所以接下来也是
git rm <filename.txt>
git commit -m "delete the filename.txt"
(3)git rm <filename.txt>
git commit -m "delete the filename.txt"
注意:(1)只要文件被提交(commit)过,就不怕找不到,只要返回到还有那个文件的版本即可;
(2)“【1.如果你用的rm删除文件,那就相当于只删除了工作区的文件,如果想要恢复,直接用git checkout -- <file>就可以
【2.如果你用的是git rm删除文件,那就相当于不仅删除了文件,而且还将文件删除这一操作添加到了暂存区(Git保存管理的是修改而不是文件),需要先git reset HEAD <file>,然后再git checkout -- <file>
【3.如果你想彻底把版本库的这一版本的文件彻底删除掉,先git rm,再git commit 就ok了。”
- 远程仓库(先有本地库,后有远程库的时候,如何关联远程库。):
$ cd ~/.ssh
$ pwd 就知道主目录的路径了
Git虽然是分布式系统,但是它必须要有一个Git服务器24小时做中转站,Github则提供了这样一个云服务器(代码托管平台,也就是那个中转站)。
- 使用本地git-bash来进行对应于本地仓库的邮箱注册一个SHH钥匙($ ssh-keygen -t rsa -C "邮箱地址" ,会生成钥匙,操作见 https://www.liaoxuefeng.com/wiki/896043488029600/896954117292416 ),这样你就有了SHH公钥(在C:\Users\31728\.ssh文件夹的id_rsa.pub里),
- 然后在github等云服务器上添加SHH公钥(Add SHH Key),
- 最后用git-bash同步仓库(
$ git remote add origin git@中转站的网址[这里是github.com]:用户名[或者到达该仓库的路径]/仓库名.git
如:$ git remote add origin git@github.com:dayixinsheng/learngit.git )
即可,其他人可以读你的仓库代码但是不能写(没有公钥)。
(remote add origin git就是将本地仓库同步到远程仓库之意。)
现在,只要本地仓库做了更改,就可以用:
$ git push -u origin master(第一次使用,origin是远程的意思)
$ git push origin master(后续使用)
同步分支(版本)到云服务器上的对于仓库了!它可以做备份,也可以同别人一起协作。
总结:
git ssh-keygen -t rsa -C "grass_in_life@outlook.com"//本地注册仓库邮箱,获取钥匙
//github上建立仓库,取个仓库名(两个仓库名可以不一样),添加SHH公钥
/*------------------------------以上是建立连接-------------------------------------*/
git remote add origin master@github.com:dayixinsheng:learngit.git//本地仓库同步到云端
git push -u origin master //首次同步分支
...//本地修改。。。
git push origin master //同步分支
- 远程仓库(建立一个远程仓库,然后本地克隆):
先远程建立一个仓库,然后本地输入:
git clone git@github.com:用户名/仓库名.git
之后cd 仓库名;进入此仓库后就可以对仓库一系列操作了。
(也可以用http协议,但是速度慢,还是用原生的ssh协议速度快。)
- 分支管理:
一个master分支显然不够用,多人协作都往一个分支上提交又肯定非常混乱,所以可以建立多个平行宇宙分支,做完后再合并。(注意,所有分支都是以主分支为模板。)
git branch //查看分支,带*表示当前分支
git branch <branch name> //创建分支
git checkout <branch name>//切换分支
git checkout -b <branch name>//创建并切换分支
git merge <branch name>//合并某分支到当前分支
git branch -d <branch name>//删除合并后的分支
- 分支冲突:
如果各个分支对同一个文件都进行了修改,合并分支的时候就会又冲突,这时再修改冲突的文件即可。
$ git log --graph --pretty=oneline --abbrev-commit//用于查看所有分支
注:vi 文件名 可以在命令行里编辑文件,若没有该文件会新建txt,具体操作如下:(https://blog.csdn.net/wangzherongrao/article/details/80785016 )
- 有历史痕迹可循的分支合并:
git merge --no-ff -m "关于此次分支合并的一些评论" <branch name>//将branch合并到当前分支
//这样,使用git log 就可以查看分支过
- 临时bug分支:
创建分支并在该分支下工作 只能每次一个进行,必须add并commit或者stash之后才能进行对另外分支操作。
git checkout -b <master name>//创建并转到分支
//在这分支上做了一些文件修改...
git add <filename>
//然后这时不想commit,因为每一次commit(提交)都是有原因的,它还要评论呢~所以不是随便就commit的,这时就可以:
git stash
//然后创建新的别的分支、该干嘛干嘛,干完之后就:
git checkout <master name>
git status list//查看该分支下的stash,若有多个stash则为数组形式
git stash pop //全部stash恢复到分支下并删除stash区的内容
git stash apply (stash[i])//或者将;第i条stash恢复到该分支
git stash drop//删除stash内容
- feature分支:
这个分支是用来专门实现某个功能而创建的分支,本来和bug分支类似的(创建、修改、添加并提交该分支下的文件--至此文件已备份不会再丢失、合并到head指向的分支、删除),但是提交之后如果还没合并就被告知要取消该功能的开发,即取消该分支的所有的代码,于是就:
git branch -D <mastername>//d表示删除已合并的分支
- 多人如何用git协作:
首先,要对应好分支:
git remote -v//查看远程仓库的详细信息,以便push和pull
git checkout -b <master name> origin/<mastername>//在远程创建分支并与本地分支同步,两个分支最好同名
//add,commit...
git push origin master_name//表示将当前(head)本地分支推送到远程(origin)仓库的master分支上
git pull //抓取当前远程分支
vi 文件名
//然后修改(本地合并冲突)。。。再push
自己在本地修改好分支,就push到远程仓库对应分支,若有冲突(远程的分支比自己当初复制到本地的版本更加新)导致无法推送,就pull 将远程的抓取下来,然后本地解决冲突,再push推送即可。
注意:push就是更新远程库;pull就是更新本地库。
总之就是:push-pull-解决冲突-push.
- rebase:略
- 标签(tag):
一个tag与一个commit_id捆绑到一起,commit_id不好记也不好找(一大推乱七八糟的数字);而tag就可以是一些有意义的数字,如V1.2。代号。
- 创建标签:
(1)先转到要打标签的分支为当前分支,然后git tag tag_name(代号)即可(默认打在当前分支的最新提交,即与其挂钩);
(2)使用git tag可以查看所有标签,git show tag_name可以查看此标签的详细信息(标签不是按照时间顺序而是字母数字顺序);
(3)使用git log --pretty=online --abbrev commit查看历史的提交id。
(4)要对历史某一次提交打上标签,可以git tag tag_name commit_id,如:git tag v0.9 f52c633.
(5)添加标签说明:
git tah -a tag_name -m "sth to say " commit_id
- 管理标签:
将本地标签与云端同步:
git push origin <tag_name>
git push origin --tags//推送本地全部未推送的标签
删除标签:
git tag -d <tag_name>//仅仅删除本地标签
git push origin :refs/tags/<tag_name>//删除远程仓库的某个标签
注意:不要git push origin --delete <tag_name>这样会把与标签挂钩的整个远程分支都给删了的(虽然版本库有保留)。
- 学习github:
github desktop就是相当于git-bash高级版,只是它不用输入如此多的linux指令,是图形化操作,与github.com有着天壤之别!
- 使用码云:
这个跟github大同小异,略。
就是同时关联两个库:
git remote add origin git @对应的云代码托管网址(github.com或者gitee.com):用户名/仓库名
git checkout -b <master name> origin/<mastername>//然后创建远程分支并转到该分支使mastername对应于远程的master name分支
git remote -v//可以查看远程仓库详细情况
以上,将origin改成不同的单词(如:github和gitee)就可以同时关联两个库了,只是在推送的时候要写好对应的远程仓库名。
- 自定义使用git:
自己可以更改一些设置,比如字体和颜色。略。
- 忽略特殊文件:
git有一个专门用于检测忽略名单的文件叫.gitignore ,只要在里面写入规则,git就会按照规则过略掉相关文件。(规则类似于sql检索规则,有通配符等)
如:
如果发现有个不需要被i过滤的文件被过滤了,可以输入一下语句查看是哪一行规则过滤了该文件:
git check-ignore -v 文件名(需要带后缀名,如.class)
- 配置别名:
有时觉得命令麻烦太长,就可以用
alias指令。
git config --global alias.简称 要改的繁称
//如:
git config --global alias.st status //将该用户下所有仓库的staus简写成st,global是全局之意,如果不加就只对当前仓库起作用
对当前仓库的配置都放在git的配置文件.git/.config目录下。不需要该简写时,只需要在[alias]后面删除对应的简写即可。
而如果是对用户的配置:
- 完结撒花~