本博客仅作个人学习记录,也希望本博客对大家也有所帮助。 |
1.git整体架构
下面这张图是从网上搜来的,感谢原作者!  工作区:也就是所看到的目录 暂存区:工作区的修改可以存储到暂存区,修改可以撤回。 仓库区:将修改好的文件提交到仓库区后不能再更改,只能提交新版本覆盖。
2.git常用命令
命令名称 | 命令作用 |
---|
git add 文件 | 将指定文件从工作区上传到暂存区 | git add . | 将所有文件从工作区上传到暂存区 | git rm 文件 | 将文件从工作区和暂存区暂存区删除 | git commit -m “日志信息” 文件名 | 将指定文件从工作暂存区上传到本地库。如果没有文件名,则上传所有文件 | git push 主机名 分支名 | 将本地库信息上传到远程库。主机名默认为origin | git status | 查看工作区和暂存区的状况 |
2.1建立本地库
建立本地库有两种方法 1.git init 用来初始化当前目录,作为本地仓库。当前目录下会产生一个.git隐藏文件夹,用来记录该仓库的信息。 2.git init 初始化一个空的新项目,然后通过 git remote add origin 远程仓库地址 和某个远程git仓库关联起来。 
2.git clone 远程库地址 拷贝一个远程git仓库到本地。除了进行git init的操作外,还会将远程git仓库的文件下载到本地仓库。
2.2用户名设置
全局用户信息 git config --global user.name 用户名 设置全局用户名 git config --global user.email 邮箱 设置全局用户邮箱 设置完成后可以在home目录下的.gitconfig文件下查看
本仓库信息信息 git config user.name 用户名 git config user.name 用户名
??当没有设置本仓库信息时,修改远程仓库默认使用全局用户信息;当设置好本仓库信息时,修改远程仓库使用本仓库用户信息。可以使用git config user.name 、git config user.email 来查看当前所使用的用户信息。 
2.3 一个提交新版本的例子
1.在工作区创建了一个新的文件gittest.txt,输入git status 可以检测到未追踪文件(Untracked files)gittest.txt,并且提示使用git add 来提交到暂存区。  2.输入命令git add gittest.txt 再查看git状态,检测到暂存区有新文件gittest.txt。  3.输入命令git commit -m 'create gittest.txt' 再查看git状态,显示本地分支比远程分支超前了一个commit,并提示用git push命令来提交本地的commit。  4.输入命令git push origin master' 将本地的commmit提交到远程仓库,再查看git状态,没有检测到需要提交的文件。 
3.git版本管理
命令名称 | 命令作用 |
---|
git log | 查看版本详细信息 | git reflog | 查看版本简易信息 | git reset | 回退版本 |
git reset 的详细用法可以看这篇文章https://www.runoob.com/git/git-reset.html 另外,版本号可以通过git reflog 查看,例如3e3de50就是当前的版本号,e8fe73d就是上一版本的版本号。 
4.git分支管理
命令名称 | 命令作用 |
---|
git checkout 分支名 | 切换分支 | git branch -v | 查看分支 | git branch 分支名 | 创建分支 | git merge 分支名 | 把指定的分支合并到当前分支上 |
4.1 origin、master、head的理解
在2.3 一个提交新版本的例子中git push origin master ,其中origin代表的是远程git服务器地址,称为远程主机名。通常我们clone一个代码,默认的远程仓库的名字就是origin。master指向master主分支上最近的一次提交,head默认指向master。在2.3例子中分支情况如下图: 
4.2 创建新分支
1.git branch feature 创建feature功能分支,feature会默认指向master,此时分支情况如下图:
 2.git checkout feature 切换到feature分支,此时分支情况如下图:  git branch -v 查看分支情况,可以看到一共有两个分支,当前分支为feature,feature和master都指向同一版本。  注意:除了用git branch -v 命令查看当前分支外,也可以查看cat .git/HEAD查看HEAD文件,该文件记录head指针指向哪个分支。
3.在feature分支上创建feature.txt文件并且提交到本地仓库。此时分支情况如下图: 通过git branch -v 也可以看到master和feature指向了两个不同的版本了  5.切换回master分支,可以看到切换分支后,工作区的内容也会跟着改变。  6.git merge feature 在master分支上合并feature分支。此时的分支情况如下  这是一种比较简单的分支合并。当两个分支合并时,会比较每一个文件的每一行内容。这里feature只比master多了一个文件,那么分支合并就直接把master指向feature的版本就可以了。
考虑一下两种情况: 1.如果两个分支对同一个文件的第一行和第二行内容进行修改,分支合并的情况是怎样的? 2.如果两个分支对同一个文件的第一行内容都进行修改,分支合并的情况又是怎样的? 对于第一个问题,git会创建一个新的版本,该版本中对这个文件的第一行和第二行的修改都进行保存,然后将两个指针同时指向这个新的版本 对于第二个问题,git除了完成上述工作外,还需要认为决定新版本内容以确定该文件第一行的内容。
|