git 教程(廖雪峰)笔记
mkdir 仓库名
cd 仓库名
pwd
mkdir 新建文件夹/目录;cd进入某文件夹;pwd 显示当前目录。
至此,创建了新的仓库并命名了仓库,进入到了该仓库并显示当前目录。
git init
写了文本文件之后(要放在仓库名目录或者子目录下,否则git找不到),将它添加到仓库中,分两步:
git add txt文件
git commit -m "评论"
【1】git add
【2】真正的提交是:git commit -m "
在实际工作中,每一次小修改就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
下面是回退之前的查询操作:
git log //显示历史版本
git reflog //显示历史操作
要想修改文件,直接修改;
然后执行git reset --hard 提交的id,或者head^,它表示是一个版本,head表示当前版本(不一定是最新的,你可能回退过),head^^表示是上上个版本,...head~100表示上一百个版本。
可是commit_id怎么找?用git log可以查看之前所有提交版本历史(不能包括回退之后的版本,显示的版本会减少,相等于回到过去),从而知道之前某个版本的id。
用git reflog可以查看所有提交命令历史,可以回退到任一个版本(就是看着有点乱,但是显示了所有的历史操作,相当于可以回到某一个过去也可以去到自己所在的未来,当然,比自己所在还远的未来是不存在的。)
注:
cat 文本文件名(包括后缀.txt)
这个命令可以显示当前文本文件的内容。
首先,git的目录一打开就是工作区,里面主要有重要的文件,和一个隐藏的目录(一个叫.git的文件夹),它就是版本库,记录着每一个文件的每一次版本修改;在版本库里有master分支和指向分支的head指针,以及最重要的暂存区。
master就是一个类似于树的结构(里面保存了每一次的工作区所有文件,也就是每一次版本),指针用于寻找它;
而暂存区,就是git add之后,被修改过的文件就被提交到了暂存区,git commit就是将暂存区里的文件全部提交到了master分支里。
“暂存区就像购物车,没到付款的时候你都不确定购物车里的东西全部都是要的。。。每拿一件商品就付一次款。。。那才麻烦大了”。
注意:
工作区就是可以任意修改文件的地方;
暂存区是待整合、待发布版本的聚合地;
master就是不可修改的历史版本(包括最新版本)。
(1)
git reset HEAD
git checkout --
以上就分别是git add和直接修改工作区文件的逆向操作。
(2)
另外,git commit没有回退操作,只能回退版本(git reset head^或commit_id,将所有flies回退),但是版本库里会有strack(痕迹);
(3)
一旦提交到远程库,由于分布式(GIT)的特性,将不可逆转。
ls可以查看所有文件的名字,从而得知文件是否被删
删除文件有三种方法:
(1)直接物理删除哈哈,这时Git是知道文件被删除了的,
只是版本库里的版本和工作区的版本不同步而已,
(想要撤销删除,直接git checkout -m
若想真正删除当前版本的该文件,使用
git rm
git commit -m "delete the filename.txt",
该版本就不存在该文件了。
(2)rm
(撤销操作一样)
所以接下来也是
git rm
git commit -m "delete the filename.txt"
(3)git rm
git commit -m "delete the filename.txt"
注意:(1)只要文件被提交(commit)过,就不怕找不到,只要返回到还有那个文件的版本即可;
(2)“【1.如果你用的rm删除文件,那就相当于只删除了工作区的文件,如果想要恢复,直接用git checkout --
【2.如果你用的是git rm删除文件,那就相当于不仅删除了文件,而且还将文件删除这一操作添加到了暂存区(Git保存管理的是修改而不是文件),需要先git reset HEAD
【3.如果你想彻底把版本库的这一版本的文件彻底删除掉,先git rm,再git commit 就ok了。”
$ cd ~/.ssh
$ pwd 就知道主目录的路径了
Git虽然是分布式系统,但是它必须要有一个Git服务器24小时做中转站,Github则提供了这样一个云服务器(代码托管平台,也就是那个中转站)。
$ git remote add origin git@中转站的网址[这里是github.com]:用户名[或者到达该仓库的路径]/仓库名.git
如:$ git remote add origin [email protected]:dayixinsheng/learngit.git )
即可,其他人可以读你的仓库代码但是不能写(没有公钥)。
(remote add origin git就是将本地仓库同步到远程仓库之意。)
现在,只要本地仓库做了更改,就可以用:
$ git push -u origin master(第一次使用,origin是远程的意思)
$ git push origin master(后续使用)
同步分支(版本)到云服务器上的对于仓库了!它可以做备份,也可以同别人一起协作。
总结:
git ssh-keygen -t rsa -C "[email protected]"//本地注册仓库邮箱,获取钥匙
//github上建立仓库,取个仓库名(两个仓库名可以不一样),添加SHH公钥
/*------------------------------以上是建立连接-------------------------------------*/
git remote add origin [email protected]:dayixinsheng:learngit.git//本地仓库同步到云端
git push -u origin master //首次同步分支
...//本地修改。。。
git push origin master //同步分支
先远程建立一个仓库,然后本地输入:
git clone [email protected]:用户名/仓库名.git
之后cd 仓库名;进入此仓库后就可以对仓库一系列操作了。
(也可以用http协议,但是速度慢,还是用原生的ssh协议速度快。)
一个master分支显然不够用,多人协作都往一个分支上提交又肯定非常混乱,所以可以建立多个平行宇宙分支,做完后再合并。(注意,所有分支都是以主分支为模板。)
git branch //查看分支,带*表示当前分支
git branch
git checkout
git checkout -b
git merge
git branch -d
如果各个分支对同一个文件都进行了修改,合并分支的时候就会又冲突,这时再修改冲突的文件即可。
$ git log --graph --pretty=oneline --abbrev-commit//用于查看所有分支
注:vi 文件名 可以在命令行里编辑文件,若没有该文件会新建txt,具体操作如下:(https://blog.csdn.net/wangzherongrao/article/details/80785016 )
git merge --no-ff -m "关于此次分支合并的一些评论"
//这样,使用git log 就可以查看分支过
创建分支并在该分支下工作 只能每次一个进行,必须add并commit或者stash之后才能进行对另外分支操作。
git checkout -b
//在这分支上做了一些文件修改...
git add
//然后这时不想commit,因为每一次commit(提交)都是有原因的,它还要评论呢~所以不是随便就commit的,这时就可以:
git stash
//然后创建新的别的分支、该干嘛干嘛,干完之后就:
git checkout
git status list//查看该分支下的stash,若有多个stash则为数组形式
git stash pop //全部stash恢复到分支下并删除stash区的内容
git stash apply (stash[i])//或者将;第i条stash恢复到该分支
git stash drop//删除stash内容
这个分支是用来专门实现某个功能而创建的分支,本来和bug分支类似的(创建、修改、添加并提交该分支下的文件--至此文件已备份不会再丢失、合并到head指向的分支、删除),但是提交之后如果还没合并就被告知要取消该功能的开发,即取消该分支的所有的代码,于是就:
git branch -D
首先,要对应好分支:
git remote -v//查看远程仓库的详细信息,以便push和pull
git checkout -b
//add,commit...
git push origin master_name//表示将当前(head)本地分支推送到远程(origin)仓库的master分支上
git pull //抓取当前远程分支
vi 文件名
//然后修改(本地合并冲突)。。。再push
自己在本地修改好分支,就push到远程仓库对应分支,若有冲突(远程的分支比自己当初复制到本地的版本更加新)导致无法推送,就pull 将远程的抓取下来,然后本地解决冲突,再push推送即可。
注意:push就是更新远程库;pull就是更新本地库。
总之就是:push-pull-解决冲突-push.
一个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
git push origin --tags//推送本地全部未推送的标签
删除标签:
git tag -d
git push origin :refs/tags/
注意:不要git push origin --delete
github desktop就是相当于git-bash高级版,只是它不用输入如此多的linux指令,是图形化操作,与github.com有着天壤之别!
这个跟github大同小异,略。
就是同时关联两个库:
git remote add origin git @对应的云代码托管网址(github.com或者gitee.com):用户名/仓库名
git checkout -b
git remote -v//可以查看远程仓库详细情况
以上,将origin改成不同的单词(如:github和gitee)就可以同时关联两个库了,只是在推送的时候要写好对应的远程仓库名。
自己可以更改一些设置,比如字体和颜色。略。
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]后面删除对应的简写即可。
而如果是对用户的配置: