整理一下以前学的东西,记的东西,全当一个学习手册了,方便以遗忘的时候快速回忆上手。
下载:
winddow 环境git下载:
https://pan.baidu.com/s/1hlW5JolgBg8XpznGeWCb9g
下载除了刚开始的下载路径可以改成你自己想安装的路径,其他的一路默认下去就好。
linux下载:
sudoaptinstallgit
理解一下一个重要的概念:
git的两区一支:工作区是指当前git init的这个文件,stage是暂存区,master是分支
开始敲命令:
初始化仓库,修改提交,回退等操作:
#首先两个相关命令,创建文件夹与创建文件的命令分别为:mkdir 文件夹名
touch 文件名
#关于仓库跟普通文件有什么不同呢,关键就在于初始化,初始化之后仓库里面就有了相应的配置信息,你用ls -a可以看到隐藏的.git文件就是包含了所有 配置信息。将当前目录初始化为一个本地仓库:git init
#将指定目录初始化为一个本地仓库,!!!!注意-> 这里的路径使用斜杠 "/" 而不是window资源管理器复制过来的\ #所以为什么比较推荐上面这种打开敲git命令界面的方式,避免了路径切换的麻烦。#还有就是建议保持这个文件为空文件夹,也不是说不可以有其他的文件,主要是看起来没那么乱。git init F:/myRepository
#先切换到仓库的文件下面,git作用范围是在仓库文件夹里面,使用pwd命令可以查看是是否为当前文件夹。创建你想编辑的文件并输入内容保存退出(这里使用的是vim编辑器)vim myFirst.txt
#.....#将文件add到暂存区里,不添加的话,git是追踪不了的gitadd myFirst.txt
#可以用ls命令查看当前文件的创建修改时间ls-l#从缓存中提交git commit -m"this is edition"#查看当前所有文件的状态,加-s是为了简写git status -s#如果修改了文件可以查看修改后与缓存中的不同gitdiff#add 修改了之后的文件可以查看不同gitdiff -- cached
#添加到缓存之后一定要提交才可以git commit -m"this is second edition"# 还可以直接添加到缓存与提交一步到位 谨慎使用!!!!!!!!!!!!!!!!!!!!!git commit -am"this is a edition"# 若是文件比较多,文件一般有后缀的,可以直接提交,add后面加个点就好了!!!!!!!!!!gitadd.#有时候你修改了很多个文件,但是不小心都add了,但是有些文件你不想提交修改那么快,这个时候你可以git reset head xxx.txt
#然后执行git commit -m ".." 的时候,上面这个从缓存中撤回来的就不会被提交更新了,只会更新其他提交的。但#用status -s查看,记录的还是显示停留在他的已修改状态,但是他的修改状态是红色,M前隔了一个空格,想要提交#得重新add#从git中移除某个文件,在当前目录也找不到了。等价于用linux 的rm删除命令删除然后在提交。如果修改后add了得#加-f强制删除gitrm<file>#如果只是想从缓存中取消跟踪,但是还希望文件保留在当前工作区,可以执行下面的命令gitrm--cached<file>#如果后面跟的是一个目录文件的话需要-r 递归删除#用以下命令可以列出所有已经被跟踪的文件git ls-tree -r master --name-only
#回退版本#先查看有哪些版本git log --oneline#回退到上一个版本是HEAD^,上上个是HEAD^git reset --hard HEAD^
#回退到指定版本,版本号可以不写全,但是你这样最新的那个版本就没有了,在没关闭前你还能找到版本号,但是关闭窗口后就找不到了。git reset --hard 1094a
#如果关闭之后又想回到最新版本,git中有个命令让你记录你的操作git reflog
#你可以找到你的版本号然后再回退就好了#撤销修改:#用命令git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区,当我们用HEAD时,表示最新的版本。git reset HEAD <file>#丢掉工作区的修改,仅仅是修改了文件,但是没有add,使用如下命令可回到最近一次add或者commitgit checkout -- readme.txt #注意--与文件名间有空格
在windows下使用git时,使用命令 git add 文件名 将文件提交到仓库时,有时会报错。
在此,先引进几个概念:
概念一
\r:回车,ASCII码13 r->return
\n:换行,ASCII码10 n->newline
二者区别:
\r : return 到当前行的最左边。
\n: newline 向下移动一行,并不移动左右。
Linux中\n表示回车+换行;
Windows中\r\n表示回车+换行。
Mac中\r表示回车+换行。
概念二:
Windows操作系统采用两个字符来进行换行,即 CRLF;Unix/Linux/Mac OS X操作系统采用单个字符来进行换行,即 LF ;
CR:Carriage Return,对应ASCII中转义字符\r,表示回车
LF:Linefeed,对应ASCII中转义字符\n,表示换行
CRLF:Carriage Return & Linefeed,\r\n,表示回车并换行
问题分析::
工作区的文件都应该用 CRLF 来换行。如果
改动文件时引入了 LF,提交改动时,git 会警告你哪些文件不是纯 CRLF 文件,但 git 不会擅自修改工作区的那些文件,而是对暂存区(我们对工作区的改动)进行修改。也因此,当我们进行 git add 的操作时,只要 git 发现改动的内容里有 LF 换行符,就还会出现这个警告。
git工作区默认为CRLF来作为换行符,所以当我们项目文件里有用的地方使用LF作为换行符,这个时候我们再继续git add 或则git commit的时候就会弹出警告,当最终push到远程仓库的时候git会统一格式全部转化为用CRLF作为换行符
总结:以上是百度上的分析,个人觉得,git bash也就是git的命令终端是沿用linux下的操作,所以我们在git bash中修改文件,然后文件中用了换行,那么linux换行方式LF,这与git版本控制系统中统一用CRLF不同,因而会警告。
解决方法是不用管他,因为当你push时git会帮你自动更换。
当然,如果你一定要用LF方式换行的话,为了不让它自动转换,可以用命令: git config –global core.autocrlf false
学习经验一:
git的修改是以文件为层级的,比如a文件夹为当前git追踪的文件,a下面有一个b文件夹,b下面有文件c.text,那么如果修改了c.text,再回到a文件夹下,那么此时git add和git commit是没有用的,他会一直提示b修改了,但就是不让你add或者commit,你要进入到b文件夹下,然后add,commit, 之后再回到a下面才可以进行add commit,感觉就是git是按一层一层的文件夹唉管理的,低级文件夹要提交之后才能在高级文件夹添加和提交。并且git是以文件名来追踪文件的,倘若文件更名了,那么文件就追踪不到了,他会认为你是删除了的。
分支合并的命令:
#分支(branch),默认的分支是master,创建分支会把最后一次提交的快照复制给新建的分支,他们两个就互不干扰#了,就相当于两个工作区了。 下面是创建分支并切换到分支newtest的命令。有两种方式:建议用第一种,嘘,别问为什么。git switch -c dev #-c是创建并切换git checkout -b newtest
#查看当前分支的命令是git branch
#删除分支git branch -d (branchname)
#合并分支规则:当前分支合并了某个分支例如master主分支合并了test分支。#既然是合并,就会遇到合并冲突的问题。经过我的测试,我发现它的规则没有规律可寻但是却又很符合人的常识。可以确定的是它不是按照时间顺序来决定的。#总结,某个文件在主分支和副分支中都存在,且都进行了修改,那么在合并时则会发生冲突,冲突将会保留由用户自己手动解决。解决之后记得add一下提交告诉git你解决了冲突就OK了,不然后面好像会切换不了分支。如果遇见有一方修改了某文件,另一方没修改过情况。则修改过的将会覆盖掉没修改过的。 当然还会存在一个分支修改文件但是另一个分支删除同名文件的问题。分如下两种情况:#1、后面的副分支删除了某个文件,但是随后主分支对此文件进行了修改,那么合并后git会认为这个文件还是有用的,仍将会被保留。#2、若是前面的主分支删除了某个文件,副分支进行了修改,合并后副分支的这个文件将会被拷贝过来,理解起来也很简单,因为git会认为这是主分支没有的文件,就相当于副分支自己新增的版本文件。#如果副分支增加了新文件,会被添加到主分支中。在副分支中修改了某个文件,但是在主分支中随后删除了这个文件,合并后这个文件还是会被还原覆盖过来。所以可以判断的是,如果主分支没有的文件,合并后必定会从副分支调过来。#若新的分支修改了某个文件,而主分支合并这段时间之前啥也没干过,那么副的分支将会将主分支完全覆盖。可以这么理解,git认为你在副分支进行了修改,而主分支没动过,那么这个修改或删除了的就是升级版将会被保留,主分支上的所有没动过的文件将会被完全舍弃被替换掉,即使是后面的操作是删除,合并之后主分支相应的没修改过的文件也会被删除。git merge test --no-ff -m"合并分支"#分支合并会创建一个commit,分支之间都可以合并#要更新你的本地仓库至最新改动,执行:git pull
#以在你的工作目录中 *获取(fetch)* 并 *合并(merge)* 远端的改动。#要合并其他分支到你的当前分支(例如 master),执行:git merge <branch>#在这两种情况下,git 都会尝试去自动合并改动。遗憾的是,这可能并非每次都成功,并可能出现*冲突(conflicts)*。 这时候就需要你修改这些文件来手动合并这些*冲突(conflicts)*。改完之后,你需要执行如下命令以将它们标记为合并成功:gitadd<filename>git commit -m"conflict fixed"#在合并改动之前,你可以使用如下命令预览差异:gitdiff<source_branch><target_branch>
分支开发策略:
查看历史命令:
#只列出版本git log --oneline#逆序列出所有版本git log --reverse--oneline#只列出前几行git log --oneline-5#查看特定时间以内历史记录git log --oneline--before={0.days.ago}--after={2020-01-07} --no-merges
#查看指定某个用户提交记录git log --author=xiongmm --oneline-5#查看工作分叉与合并git log --oneline-graph
标签:
创建一个带注解的标签
git tag -a v2.0
#打标签是为了记录这次重要的提交版本,它是给当前最后一次提交打标签
查看记录
git log --decorate#跟git log好像没什么区别,都可以查看标签
查看有哪些标签
给某次提交追加标签
git tag -a v0.9 85fc7e7
指定标签信息
git tag -a<tagname>-m"runoob.com标签"
在这里可以巧用 touch 这个命令(<u>只是一个补充,可以忽略</u>)
Linux touch命令用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件。
ls -l 可以显示档案的时间记录。
虽然感觉好像没啥用,用vim修改好像也会改变他的时间,总之就当多学了一个linux命令。
ps:git是对文本信息进行追踪,二进制的内容它识别不了,且文件不归它管。
git与远程服务器github:
添加远程仓库,从本地提交提交:
- 注册github的账号,记住注册账号所用的邮箱还有你自己github的注册id名称。
- 在本地获取ssh密匙(github仓库与本地仓库的信息传递需要加密),github连接我看到有两种一种是ssh另一种是https,这里用ssh加密:1.
ssh-keygen -t rsa -C "[email protected]
输入命令后一路默认下去(在本地不需要设置ssh连接密码),会生成一个公共钥匙和私密钥匙的两个文件,文件路径默认是C:\Users\Windows 10.ssh - 打开并复制公共钥匙文件的内容。再转到到个人网站点击github头像——settings——ssh中——增加key,title随便填,粘贴内容到下面那个框保存即可。2. 测试一下是否可以连接github
ssh-T [email protected]
- 打开并复制公共钥匙文件的内容。再转到到个人网站点击github头像——settings——ssh中——增加key,title随便填,粘贴内容到下面那个框保存即可。2. 测试一下是否可以连接github
- 把本地仓库传到github上去,在此之前还需要设置username和email,因为github每次commit都会记录他们。1.
git config --global user.name "xiongmm"git config --global user.email "[email protected]"
- 添加仓库,在github上面创建你的仓库,获取你的仓库的地址。在本地连接你的github仓库(origin):1.
#在本地给这个远程仓库取了别名origin,你换成别的也可以git remote add origin [email protected]:xiongzhentao/yourRepo.git
*感觉git在连接远程仓库后他会在本地复制一份远程 的工作区叫 origin (所连接的哪个远程仓库取的别名)*,从github的服务器仓库上拉下来的版本信息会保存在这个origin上,然后他就相当于一个中介缓存一样。本地仓库可以对其进行合并的操作。然后上传到github也是对这个中介操作,后面这个中介origin再传到github上去。 - 查看远程连接的命令1.
git remote -v
我们远程连接的目的是为了在远程数据库上备份,跟不在同一个开发环境下的其他人一起进行开发(分布式)2. 把本地的仓库传到自己的github上,这里实际上是传分支:git push -u origin master````这里强调一下,“第一次提交一个分支”,一定要加-u,无论你第一次提交的哪个分支,第一次都加一个-u.这样做的目的是后面提交的时候,假如你有两个分支一个是master,一个是test。你在testf分支下面做了修改,要在github上面git 也跟着更新。可以直接
git push而不需要
git push origin test从而简化了操作。当然如果你在master分支下用git push他提交的只是master的简便操作。 所以如果在其他分支如在master下你还是得用git push origin test去更新远程仓库的test分支信息。
如果第一次上传提交某个分支没用-u参数去,后面强行用git push会报错```:The current branch three has no upstream branch.不过你再后面的提交加上-u还是可以继续关联的的。 - 删除仓库1.
git remote rm origin2#然后查看还有哪些远程连接仓库git remote -v
- 提取远程仓库,合并1.
#获取远程仓库的分支及其数据git fetch origin#将更新同步到本地,也就是你想合并哪个分支,就在哪个分支下去合并origin的哪个分支git merge origin/master
自定义git:
- 忽略某些特殊文件:
忽略某些特殊文件的解决办法
- 配置别名- 我们只需要敲一行命令,告诉Git,以后
st
就表示status
:$ git config --global alias.st status
好了,现在敲git st
看看效果。当然还有别的命令可以简写,很多人都用co
表示checkout
,ci
表示commit
,br
表示branch
:$ git config --global alias.co checkout$ git config --global alias.ci commit$ git config --global alias.br branch
以后提交就可以简写成:$ git ci -m"bala bala bala..."``````--global
参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用。
4、git服务器的搭建:
4.1查看服务器是否自带:
git--version
在centos中,安装的话,分为用yum安装和下载git源码编译安装。但是cetos5以及以下版本中的yum都没有git,无法使用yum安装,而cetos6可以使用yum安装git,但是安装的git是1.7.1版本的,而github需要的git版本最低都不能低于1.7.2。所以如果是cetos7以及以上版本的,推荐使用yum安装,方便,如果是cetos7以下的,请使用git源码编译安装git。
4.2卸载低版本的git
yum remove git
- which git查看git安装在哪
- where git查看git的执行文件在哪
- whoami查看当前用户
4.3新版2.x的git安装
下载:https://www.cnblogs.com/zmdComeOn/p/9597892.html
安装:https://blog.csdn.net/w252064/article/details/82691343
5、多人合作使用git管理版本协同开发:
5.1~~~~~~~~~~~~~~~~~后面再补充
版权归原作者 桃笑夭 所有, 如有侵权,请联系我们删除。