学习网站:廖雪峰的官方网站
为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件。
1.在ubuntu上安装Git
首先,你可以试着输入
git
看看系统有没有安装Git.若没有安装:
sudo apt-get install git
配置用户信息(可选):
git config --global user.name "Your Name" #(可选)
git config --global user.email "email@example.com" #(可选)
注意git config命令的–global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
2.创建版本库
在一个空目录下输入
git init
即可将该目录变成Git可以管理的仓库。此时,Git自动为我们创建了唯一一个master分支。与此同时目录中会生成.git目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
3.把新建文件/修改文件提交到版本库
分两步,第一步在当前版本库的根目录下打开命令行,将工作区中新建/修改的文件添加到暂存区(index/stage)。
git add "filename"
第二步将暂存区的文件提交到当前分支(版本库),并添加此次提交的说明描述。
git commit -m "some manuals"
可以用一个命令查看当前状态,如:是否有修改未add/commit。该命令为:
git status
也可以用一个命令查看指定文件在工作区和版本库里面最新版本的区别。该命令为:
git diff HEAD -- "filename"
4.版本回退
首先查看提交日志:
git log --oneline -5
git log命令显示从最近到最远的提交日志。--oneline
将单次提交的日志在一行中显示,如:eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote a readme file
,前面的一串十六进制数字代表该次提交的版本号(commit id),后面的几个单词是我们在提交该版本时添加的此次提交的说明描述。-5
表示只查看最近5次的提交日志,该数字可以自行修改。
回退到上一个版本:
git reset --hard HEAD^
回退到上上一个版本:
git reset --hard HEAD^^
回退到指定的某个版本:
git reset --hard "版本commit id前5、6位字符"
一般用版本commit id前若干位字符来代指整个commit id。具体位数可以自行确定,只要不与其他版本的重复即可。
若回退到了某个旧版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本却找不到新版本的commit id怎么办?可以输入
git reflog
它记录你的每一次历史命令,包括clone、commit、reset及其对应的版本号。
5.工作区和暂存区
工作区:你能看到的目录下的文件。
版本库:隐藏目录.git。
暂存区:.git中的index(有的也叫stage)文件。
直接看原网站解释
6.撤销修改
三种情况。
一、该修改尚在工作区。一个命令可以丢弃指定文件在工作区的修改:
git checkout -- "filename"
改命令其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
二、该修改已经添加到暂存区。一个命令可以把暂存区的修改撤销掉(unstage),重新放回工作区:
git reset HEAD "filename"
然后按照第一种情况的方法丢弃工作区的修改。
三、已经提交了不合适的修改到版本库。想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
7.删除文件
两种情况。
一、要删除工作区中某文件,并将删除同步到版本库中。
方法一:手动用文件管理器删除某文件 + git add "filename"
+ git commit -m "some manuals"
。
方法二:git rm "filename"
+ git commit -m "some manuals"
。
特别注意:git rm "filename"
会直接从工作区中删除文件,并把删除同步到暂存区。
二、删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本。
按照6撤销修改的方法撤销即可。
但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
8.关联远程库并推送内容
8.1在github上新建/删除git库的方法
新建空git库:
登录 -> 单击右上角“+”号 -> 单击“new repository” -> 填写“Repository name*”内容 -> 单击左下方“Creat repository”。
删除git库:
登录 -> 进入想删除的库中,在标题栏中找到"Settings"并单击 -> 进度条拉到最底端单击“Delete this repository” -> 弹窗提示"Please type ****** to confirm",把*部分的内容填写空格里面,单击空格下面的一行话。
8.2将本地git库与空的远程库关联
git remote add origin git@github.com:your-github-signed-in-name/your-github-repository-name.git
本地库所在根目录名与远程库名不必相同(但最好相同,便于自己对上号)。origin为默认的远程库代称,可以改但没必要(除非你要同时关联github+gitee/gitlab,则可以将默认远程库)。注意将your-github-signed-in-name和your-github-repository-name分别换为你的github登录名和你要关联的远程库的名字,这个名字是你刚刚在“Repository name*”中所写的内容。
8.3克隆远程库到本地(自动关联)
通过SSH协议
git clone git@github.com:your-github-signed-in-name/your-github-repository-name.git
通过http协议
git clone https://github.com/your-github-signed-in-name/your-github-repository-name.git
克隆到本地的远程库与github上的远程库本身自动关联。
实际上,Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。
使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https。
8.4手动关联本地已有分支与远程已有分支
git branch --set-upstream-to=origin/<branch-name> <branch-name>
创建本地分支和远程分支的链接关系,注意:手动关联的远程分支需要与本地分支同名。
8.5手动创建本地分支并关联远程已有分支
git checkout -b <branch-name> origin/<branch-name>
本地和远程分支的名称必须相同。
8.5将关联了远程库的本地库内容推送到远程库
git push -u origin master
实际上是把当前分支master推送到远程。
-u
参数:若远程库是空的,我们第一次推送master分支时,需要加上-u
参数。加上后,Git不但会把本地的master分支内容推送到远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。若远程库不为空/不是第一次推送,则不用加-u
参数。
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master
推送最新修改;
分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,也就是有没有联网都可以正常工作,当有网络的时候,再把本地提交推送一下就完成了同步,真是太方便了!
9.分支管理
9.1在github上创建及删除分支
在github上创建分支:
进入需要创建的git远程库中,单击"code" -> 单击"master" -> 出现的搜索框里写上新建分支的名字 -> “enter”键确定/点击“creat branch:你输入的分支名”
在github上删除分支:
进入需要创建的git远程库中,单击"code" -> 单击"master"与"tags"中间的"branches" -> 在“Your branches”列表中点击你想要删除的分支右侧的“删除”图标。
9.2分支查看创建合并删除
分支创建合并删除的原理
查看当前分支命令(该命令会列出所有本地分支,当前分支前面会标一个*号):
git branch
查看所有分支命令(该命令会列出所有本地及远程分支,当前分支前面会标一个*号):
git branch -a
(有时候,远程明明有有某分支,可是没有显示在结果中。
原因:这条命令不是每一次都从远程更新仓库信息。
解决方法:手动更新。命令:git fetch origin
)
创建分支命令(一般会在开发新feature/修复bug时创建新的分支):
git branch <name>
切换分支命令:
git checkout <name>
创建+切换分支命令:
git checkout -b <name>
合并指定分支到当前分支命令:
git merge <name>
删除指定分支命令(一般会在合并分支后删除多余分支,删除未合并的分支时,需要将参数-d
换成参数-D
强制删除):
git branch -d <name> #删除已合并分支
git branch -D <name> #删除未合并分支
查看分支合并图命令(--oneline
参数将一次提交信息显示在一行):
git log --graph --oneline
若要合并分支并创建一个新的commit(即让分支合并图中显示一行合并分支的信息),则需在合并时添加--no-ff
参数,强制禁用Fast forward
模式。合并分支命令变为:
git merge --no-ff -m "merge with no-ff" <name>
合并分支时,加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
master分支仅用来发布新版本。
平时干活都在dev(也可叫其他名)分支上,到某个版本发布时,再把dev分支合并到master上。
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
9.3分支合并冲突的观测与解决
发生分支合并冲突时,命令行会提示CONFLICT (content): Merge conflict in <filename>
,也可以通过git status
查看当前Unmerged paths。
cat <filename>
查看冲突文件的内容,Git用<<<<<<<,=======,>>>>>>>
标记出不同分支的内容。
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再将修改后的文件添加到缓存区并提交。
9.4bug分支
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除。
当手头工作没有完成时,先把工作现场git stash
一下,然后去修复bug,修复后,再git stash pop
(恢复同时删除stash内容),回到工作现场;你可以多次git stash
,恢复的时候,先用git stash list
查看,然后用命令git stash apply <stashName>
恢复指定的stash,最后用git stash drop
来删除stash内容。
git stash #保存工作现场
git stash list #查看已保存的stash列表
git stash apply <stashName> #恢复指定的stash,stash名字形如stash@{0}
git stash drop #删除stash内容
git stash pop #恢复同时删除stash内容(只适用于stash列表中仅有一个stash的情况)
在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit id>
命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
也可以直接在dev分支上修复bug,然后在master分支上“重放”。
9.5多人协作
查看远程库信息命令:
git remote -v
结果中还会显示远程库分支及有无相关权限(fetch、push)。
☆多人协作的工作模式通常是这样:///
首先,可以试图用git push origin <branch-name>
推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull
下载远程分支然后试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin <branch-name>
推送就能成功!
如果git pull
提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to=origin/<branch-name> <branch-name>
创建本地分支和远程分支的链接关系。
10.标签管理
新建标签(默认为HEAD(当前版本),也可指定一个commit id)命令:
git tag <tagname> (<commit id>)
新建标签并添加标签说明命令:
git tag -a <tagname> -m "manuals..." (<commit id>)
查看所有标签名字命令:
git tag
查看指定标签说明信息命令:
git show <tagname>
推送一个本地标签命令:
git push origin <tagname>
推送全部未推送过的本地标签命令:
git push origin --tags
删除本地标签:
git tag -d <tagname>
删除远程标签:
git push origin :refs/tags/<tagname>
11.应用举例
Git global setup
git config --global user.name "<your name>"
git config --global user.email "<your email>"
Create a new repository
git clone git@github.com:<repo name>.git
cd <clone floder>
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master
Push an existing folder
cd existing_folder
git init
git remote add origin git@github.com:<repo name>.git
git add .
git commit -m "Initial commit"
git push -u origin master
Push an existing Git repository
cd existing_repo
git remote rename origin old-origin
git remote add origin git@github.com:<repo name>.git
git push -u origin --all
git push -u origin --tags