1.git
git是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的分布式版本的控制软件,用于敏捷高效的处理任何项目的版本问题,由于它采用了分布式版本库的方式,所以不受服务器端软件支持。
**关于项目版本管理:**项目在开发的过程中,经常会出现多人分工协作进行项目分发并开发整合的过程,所以项目在刚开始实行的时候经常会出现一些协作开发的同步的问题,同时存在项目整体进度的控制和管理的问题,所以在程序开发行业衍生出来了版本管理工具。Git 是一个分布式的版本控制系统,在 Git 中即使用户离线,也能进行项目的提交和更新操作,等到下次连线服务器时进行整体的同步操作。
工作区、暂存区及版本库的概念:
工作区:个人 PC 中能看到的文件目录结构;
暂存区: stage/index,一般存放在.git/index 中,所以 git 中的暂存区也会称为索引;
版本库:工作区中的.git 隐藏文件,不算是工作区,而是 Git 的版本库。
2.安装git
在Windows上安装Git
在Windows上使用Git,可以从Git官网直接下载安装程序,然后按默认选项安装即可。
安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
3.Linux命令
ls 查看当前目录下文件
cd 文件夹 进入文件夹
mkdir 创建目录
touch 文件 创建文件
vi 文件 编辑文件
cat 文件 查看文件内容
rm -f 文件 删除文件
4.git使用
1.配置用户名和邮箱
安装完成后,还需要最后一步设置,在命令行输入
git config --global user.name “Your Name”
git config --global user.email "email@example.com"
2.本地操作
- 创建 git init
- 用命令git add告诉Git,把文件添加到仓库:git add test.html
- 用命令git commit告诉Git,把文件提交到仓库,gitcommit-m“我是注释”
- 运行git status命令看看结果
- 本地操作常用命令
git init #初始化
git add 文件名 #添加到暂存区
git add * #添加到暂存区
git commit -m ‘完成了首页功能’
git log ‘命令显示从最近到最远的提交日志’
git reflog ‘记录你的每一次命令’
git reset --hard 版本
3.远程操作
我们在本地保存代码很不安全,容易丢失(电脑丢失),所以我们一般会在服务器上建立远程仓库,然后下载到本地电脑一份,叫本地仓库,做修改,然后提交到本地git仓库,最后每完成一些功能,我们可以本地电脑上仓库代码同步(推送)到远程仓库。
假设我们从零开发,那么最好的方式是先创建远程库,然后,从远程库下载克隆
免费的远程git服务器:
https://github.com/ 国外
https://gitee.com/ 国内
注册账号,然后在远程服务器上新建一个仓库 ,然后把远程仓库下载到本地;
要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆;
每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改。
远程操作流程:
git clone 网址
git add
git commit -m ‘aaa’
git pull origin master
git push origin master
4.分支操作
每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。
一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:
每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长;当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:
你看,Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:
假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:
所以Git合并分支也很快!就改改指针,工作区内容也不变!合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:
首先,我们创建dev分支,然后切换到dev分支:
$ git checkout -b dev
结果显示:
Switched to a new branch ‘dev’
git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
$ git branch dev
$ git checkout dev
结果显示:
Switched to branch ‘dev’
然后,用git branch命令查看当前分支:
$ git branch
结果显示:
* dev
master
git branch命令会列出所有分支,当前分支前面会标一个*号。然后,我们就可以在dev分支上正常提交,然后提交。
现在,dev分支的工作完成,我们就可以切换回master分支:
$ git checkout master
结果显示:
Switched to branch ‘master’
切换回master分支后,再查看一个readme.txt文件,刚才添加的内容不见了!因为那个提交是在dev分支上,而master分支此刻的提交点并没有变:
现在,我们把dev分支的工作成果合并到master分支上:
$ git merge dev
结果显示:
Updating d46f35e…b17d20e
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
git merge命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。合并完成后,就可以放心地删除dev分支了:
$ git branch -d dev
结果显示:
Deleted branch dev (was b17d20e).
删除后,查看branch,就只剩下master分支了:
$ git branch
结果显示:
* master
因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。
5.常用分支命令
Git鼓励大量使用分支:
查看分支:git branch
创建分支:git branch
切换分支:git checkout
创建+切换分支:git checkout -b
合并某分支到当前分支:git merge
删除分支:git branch -d
6.冲突解决
人生不如意之事十之八九,合并分支往往也不是一帆风顺的。
准备新的feature1分支,继续我们的新分支开发:
$ git checkout -b feature1
结果显示:
Switched to a new branch ‘feature1’
修改readme.txt最后一行,改为:
Creating a new branch is quick AND simple.
在feature1分支上提交:
$ git add readme.txt
$ git commit -m “AND simple”
结果显示:
[feature1 14096d0] AND simple
1 file changed, 1 insertion(+), 1 deletion(-)
切换到master分支:
$ git checkout master
结果显示:
Switched to branch ‘master’
Your branch is ahead of ‘origin/master’ by 1 commit.
(use "git push"to publish your local commits)
Git还会自动提示我们当前master分支比远程的master分支要超前1个提交。
在master分支上把readme.txt文件的最后一行改为:
Creating a new branch is quick & simple.
提交:
$ git add readme.txt
$ git commit -m “& simple”
结果显示:
[master 5dc6824] & simple
1 file changed, 1 insertion(+), 1 deletion(-)
现在,master分支和feature1分支各自都分别有新的提交,变成了这样:
这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,我们试试看:
$ git merge feature1
结果显示:
Auto-merging readme.txt
CONFLICT (content):Merge conflict in readme.txt
Automatic merge failed; fix conflicts andthen commit the result.
果然冲突了!Git告诉我们,readme.txt文件存在冲突,必须手动解决冲突后再提交。git status也可以告诉我们冲突的文件:
$ git status
结果显示:
On branch master
Your branch is ahead of ‘origin/master’ by 2 commits.
(use"git push" to publish your local commits)
You have unmerged paths.
(fix conflicts and run “git commit”)
(use"git merge --abort" to abort the merge)
Unmerged paths:
(use"git add …" to mark resolution)
both modified: readme.txt
no changes added to commit (use"git add"and/or"git commit -a")
我们可以直接查看readme.txt的内容:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<<HEAD
Creatinganewbranchisquick & simple.
=======
CreatinganewbranchisquickANDsimple.
>>>>>>> feature1
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们修改如下后保存:
Creating a new branch is quick and simple.
再提交:
$ git add readme.txt
$ git commit -m “conflict fixed”
结果显示:
[master cf810e4] conflict fixed
现在,master分支和feature1分支变成了下图所示:
用带参数的git log也可以看到分支的合并情况:
$ git log --graph --pretty=oneline --abbrev-commit
结果显示:
* cf810e4 (HEAD -> master) conflict fixed
|\
| * 14096d0 (feature1) AND simple
* | 5dc6824 & simple
|/
* b17d20e branch test
* d46f35e (origin/master) remove test.txt
* b84166e add test.txt
* 519219b git tracks changes
* e43a48b understand how stage works
* 1094adb append GPL
* e475afc add distributed
* eaadf4e wrote a readme file
最后,删除feature1分支:
$ git branch -d feature1
结果显示:
Deleted branch feature1 (was 14096d0).
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
用git log --graph命令可以看到分支合并图。
7.推送分支
推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:
$ git push origin master
如果要推送其他分支,比如dev,就改成:
$ git push origin dev
但是,并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?
master分支是主分支,因此要时刻与远程同步;
dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步。
8.具体使用
https://gitee.com/ 如果想要自己搭建git服务器 gitlab
1-安装git,安装TortoiseGit
2-第一次进公司需要下载项目
3-克隆clone https://git.oschina.net/xiang/elm.git
4-修改一下代码,提交本地 commit
5-每提交给服务器之前都需要pull(拉)一下,把最新的代码拉下来
6-提交给服务器 push