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出来合并代码即可。