Git超详细教程

git是代码管理非常出色的工具,具备代码分支管理,分支合并,修改撤销,仓库推送/拉取等等功能,使我们自己编写代码和与别人合作开发的过程中效率倍增!本文详细介绍git的各种命令用法,使得初学者能够掌握大部分非常有用和非常常用的功能!

1.初始化和建立仓库

1.1 本地初始化

cd进入工程根目录

git init

1.2 服务器端初始化

cd进入工程目录.在第一次push代码之前是一定要进行push操作的,github需要在网页端初始化,如果没有网页端,那么我们就需要这样操作:

git init --bare

1.3 从服务器clone代码

从指定地址clone代码到本地

git clone url

注意:代码克隆到本地后如果要将修改后的代码push上去,最好在仓库中增加远程仓库等设置,虽然push的时候直接指定相同的url也可以,但是这样不方便长期操作,因为每次都要输入完整的URL。使用clone指令clone代码时,url会被默认为origin别名,也就是可以修改了后直接push到origin就可以修改原始仓库的代码

2.查看当前的修改

查看当前有改动的文件

git status

3.提交代码

3.1 将代码提交到索引库

将指定文件的修改放入索引库

git add filename

将所有的修改放入索引库。cd到工程根目录

git add .

3.2 提交代码

提交索引库里面的代码

git commit -m "information"

其中的information就像是注释一样,注明现阶段提交的备注

3.3 追加修改提交

有时候我们提交代码后发现还需要更改一些追加提交

git commit --amend

该命令会撤销上一次提交,并且将暂存区的内容重新提交到版本库中.这时候push代码到远端需要加上-f参数

4.在工程中增加/删除远程仓库

4.1 增加

如果我们需要长期进行开发工作,我们可能需要经常push代码到远程仓库,也可能经常从远程仓库fetch/pull代码到本地,我们最好为远程仓库设置一个别名,这样方便我们进行上述操作。

git remote add alias url

其中alias是我们设置的别名,url是对应的仓库url

4.2 删除

删除我们增加的远程仓库,因为我们写错了信息等。

git remote remove alias

5.push代码

将已经在本地commit的代码push到远程仓库。

git push alias branch # push当前分支
git push alias branch # push指定分支
git push alias --all # push所有分支修改

alias为远程仓库别名,也可以直接写完整的url,branch为制定要push的分支,如果没有指定branch,那么将会将所有有改动commit的分支都push上去。
注意:push的代码只会是在本地已经commit的,在工作区和在索引区的代码是不会被push上去的。

6.branch操作

分支操作是非常有用的功能,我们可以在给程序增加某个功能的时候从master(默认主分支)创建一个新的分支,然后在该分支上进行开发,在开发完成后再merge(合并)到主分支上去,这样如果开发失败可以直接删除分支而不影响以前的开发工作,而且我们可以同时进行多个操作,比如在进行新功能开发的同时还可以同时对以前的漏洞进行修补。

6.1 查看分支

查看当前拥有的分支和当前工作区所在的分支

git branch

在列出的分支中,前面带*的就是当前工作区所在的分支。如果我们是从远程仓库clone克隆的仓库,那么我们可能第一次使用该命令只会看到master分支,这时候如果我们想要查看其他子分支:

git branch -r

该命令是查看远程的所有分支,我们在本地可以使用checkout分支切换过去,这样本地会创建对应的分支.下面我们查看所有分支

git brach -a

该命令会列出所有的远程分支和本地分支,也可以使用checkout命令切换过去。

6.2 切换分支

切换分支之前,我们需要对工作区和索引区没有commit的代码进行保存,有两种方案,一种是已经完成了,那么我们就commit提交代码,如果只是临时的切换,并没有完成,不需要commit,那么就使用stash命令暂存。
切换分支:

git checkout branchname

如果是切换到远程的仓库,我们需要在branch里面加上远程仓库的名字作为路径名,比如远程仓库名字是light,那么branch就应该是light/branch

6.3 创建新分支

创建不存在的分支

git checkout -b branchname

这样就会在本地创建新的名字为branchname的分支。而且在下次push的时候,可以将本分支push上去。
从远程分支创建本地新分支

git checkout -b 本地分支名 远程分支名

一定要创建本地分支并且在本地分支上面进行修改然后push上去,不然可能修改了会发现push不上去(server端的代码没有改动)

6.4 检出指定分支的指定文件到当前工作区

git checkout branch_name file_path

6.4 删除分支

6.4.1 删除本地分支

如果存在不需要的分支需要删除,那么

git branch -d branchname

强制删除分支:

git branch -D branchname 

删除本地分支后,下次push如果没有指定分支,那么远程分支也会被删除。

6.4.2 删除远程分支

git push origin --delete BranchName

`
其中的origin是远程的仓库别名,clone代码的url会默认为origin。
注意:

gt branch -r -D branch_name

只会删除本地分支跟踪远程分支,不会删除服务器的分支数据。

6.5 更新远程分支列表

git remote update origin --prune

注意origin为远程仓库名字

7.工作暂存

7.1 存储内容

有时候想不commit代码,但是切换到其他的branch,这时候我们需要现将工作区和索引区的内容暂存才能切换。

git stash [save "information"]

该指令将工作区clear,所有暂存和未暂存的改动保存,便于branch切换,也可以在以后恢复现在的工作.information是一个和commit差不多的备注信息,便于以后找到现在的存储内容。

7.2 查看已经存储的内容

如果要查看已经存储的内容:

git stash list

7.3 恢复存储的内容

在这之前一定要确认工作区是干净的,没有任何的改动,也就是和以前stash之后一样。

git stash pop

该指令在应用了之后会删除应用的内容,将存储堆栈中的第一项应用并且删除,不是很建议使用该命令,我们可以用这个代替:

git stash apply stashname

该指令可以应用制定的存储内容,而且不会删除内容。

7.4 删除存储内容

删除存储堆栈中指定的内容:

git stash drop stashname

清空存储堆栈中的内容:

git stash clear

8.从远程获取修改并且合并到本地

8.1 从远程获取修改

git fetch alias/url [branch]

不指定banch会将所有分支的修改下载下来.获取了代码之后并没有合并到本地,这时候在工作区是看不到有任何改变的,下面我们合并代码,将push的代码合并到当前工作区的分支:

git merge remotebranchname [--no-ff]

其中的remotebranchname是远程的分支名,如果有多个远程仓库要制定远程仓库的名字。在merge代码的时候,强烈要求使用–no-ff参数,这样的话可以将远程的修改记录保留到本地,我们可以查看远程的修改记录。

8.2 一步到位

使用pull命令可以一步将代码fetch下来并且自动merge。

git pull alias/url [branch]

实际中不建议使用

9 查看改动

9.1 比较工作区和暂存区

有时候我们不仅要知道哪个文件有改动,还需要直到改动在哪里,git可以帮我们查找改动点:

git diff 

不加参数时默认比较工作区和暂存区(索引区)

9.2 比较暂存区和最新本地版本库(本地库中最近一次commit的内容)

git diff --cached [path/filename]

9.3 比较工作区与最新本地版本库

git diff HEAD -- [path/filename]

注意上面的指令”–“前后有空格。

10 撤销修改

有时候我们需要将修改给撤销掉,因为意识到自己改错了或者其他原因。我们使用git reset指令来将当前branch撤销更改大以前的commit。

10.1 HEAD指针reset

该指针指向的是现在工作branch的最新提交版本。

git reset HEAD

该指令的默认参数是”–mixed“,该指令不会进行任何的工作,因为HEAD指针指向的就是当前的最新commit,而如果我们使用

git reset HEAD-1

那么就是回退到上一个commit版本,-2就是上上个commit版本,当然,我们还可以将HEAD换成相应的版本号来回退到相应的版本。

10.2 “–soft”参数

该参数告诉git只是将HEAD指针指向指定的commit,除此而外什么也不做。也就是说暂存区和工作区不会发生变化。所有的在original HEAD和你重置到的那个commit之间的所有变更集都放在stage(index)区域中。这时候的HEAD代码和工作区、暂存区的是不一样的,工作区和暂存区的是一样的。

10.3 “–hard”参数

该参数使得git不仅会改变HEAD指针到对应的commit版本,而且还会修改暂存区和工作区与回退到的commit版本一致。这时三者一致。

10.4 ”–mixed“参数

该参数是reset的默认参数,他会重置HEAD到另一个指定的commit,并且重置暂存区和那个commit对应,但是工作区的内容不会改变。在以前的commit和更改后的commit的修改会作为local modifications保存在工作区中,但是还没有加入暂存区。

10.5 撤销工作区的修改

git checkout [--文件]

11 忽略跟踪指定文件

11.1 工程开发前

在git项目根目录下增加.gitignore文件,然后在里面一行一个文件或者文件夹名,对应的文件夹和文件夹名就是对应的忽略跟踪的文件和文件夹名。

11.2 工程开发中

在使用git的过程中,可能一个工程在开发的过程中需要不跟踪某个文件,这时候即使我们使用了.gitignore文件并且在里面指定了忽略的文件也不会停止跟踪,我们还需要在库里面删除文件来停止跟踪。

git rm --cached readme1.txt #删除readme1.txt的跟踪,并保留在本地。
git rm --f readme1.txt #删除readme1.txt的跟踪,并且删除本地文件。

12 常用技巧

12.1 代码修改后merge

从该服务器端拉取新的代码后,如果本地该分支被修改了,远程的分支也被修改了,那么在merge之前可以先stash本地代码,然后merge,然后再pop出来合并代码即可。

发表评论

电子邮件地址不会被公开。 必填项已用*标注