Git工程开发实践(三)——Git常用操作

Git工程开发实践(三)——Git常用操作

一、Git仓库操作

1、Git仓库创建

git init
在当前目录中初始化Git仓库
git init [project-name]
创建一个新目录并初始化仓库
初始化git仓库会默认创建一个mater分支,创建名为.git的子目录,内含初始化Git仓库中所有的骨干文件,此时仓库中的文件还没有被跟踪。
通过git add命令来实现对指定文件的跟踪,然后执行git commit提交。

git add .
git commit -m 'initial project version'

.git仓库目录如下:
A、HEAD:当前处于哪个分支
B、config:项目的配置信息
C、description:项目描述信息
D、index:索引文件(暂存区)
E、hooks/:系统默认钩子脚本目录
F、logs/:各个refs的历史信息
G、objects/:git仓库的所有对象(commit,tree,blog,tag)
H、refs/:标识目录中每一个分支指向哪个commit

2、Git仓库克隆

Git克隆仓库的命令格式: git clone [url]
当执行git clone命令的时候,默认配置下远程Git仓库中的每一个文件的每一个版本都将被拉取下来。所有本地分支默认与远程主机的同名分支,并建立追踪关系。
克隆Git的可链接库libgit2的命令如下:
git clone https://github.com/libgit2/libgit2
在当前目录下创建一个名为libgit2的目录,并在目录下初始化一个.git目录,从远程仓库拉取下所有数据放入.git目录,然后从中读取最新版本的文件的拷贝。
如果指定本地创建的仓库名字变为libgit,可以使用:
git clone https://github.com/libgit2/libgit2 libgit
git clone是一个封装了其它命令的命令,执行git clone命令会执行以下操作:创建一个新目录,切换到新的目录,然后git init来初始化一个空的Git仓库,然后为指定的URL添加一个(默认名称为origin)远程仓库(git remote add),再针对远程仓库执行git fetch,最后通过git checkout将远程仓库的最新提交检出到本地的工作目录。
git clone支持四种协议,HTTP(S)、SSH、Git、本地文件协议。
git clone -o newname [url]
从url克隆仓库时指定创建目录为newname
二、Git文件操作
1、Git文件状态
Git工程开发实践(三)——Git常用操作
Untracked: 未跟踪,文件在工作目录中,但没有加入到仓库,不参与版本控制。通过git add将状态变为Staged。
Unmodified: 文件已经加入版本库,未修改,即版本库中的文件快照内容与工作目录中完全一致。如果被修改,变为Modified;如果使用git rm移出版本库,则成为Untracked。
Modified: 文件被修改,并没有进行其它操作。通过git add可进入暂存staged状态,使用git checkout则丢弃修改,返回到unmodified状态。git checkout即从版本库中取出文件,覆盖当前修改。
Staged: 暂存状态。执行git commit则将修改同步到版本库中,此时版本库中的文件和本地文件一致,文件为Unmodified状态。执行git reset HEAD filename取消暂存,文件状态为Modified。
文件状态的查看可以使用如下命令:
git status [filename]
查看指定文件状态
git status
查看所有文件状态

2、Git添加文件与目录

git add将工作目录的变化添加到暂存区,以备下次提交。
git add [file1] [file2] ...
添加指定文件到暂存区
git add [dir]
添加指定目录到暂存区,包括子目录

git add .  添加新文件和被修改文件到暂存区,但不包括被删除文件
git add -u  提交被修改和被删除文件到暂存区,不包括新文件
git add -A 添加工作目录的所有变化到暂存区

3、Git删除文件与目录

git rm --cached <file>
直接从暂存区删除文件,工作区则不做改变
git reset HEAD <file>...
如果已经用add把文件加入暂存区,先需要从暂存区中撤销;
当执行git reset HEAD命令时,暂存区的目录树会被重写,被当前分支指向的目录树所替换,但工作区不受影响。
git clean [options]
移除所有未跟踪文件,-d表示包含目录,-f表示强制清除。
git rm filename
删除暂存区、工作目录中的文件

4、Git文件差异查看

git diff用于查看工作目录中的文件和暂存区文件的差异
git diff [files]
当暂存区中没有文件时,比较工作区中的文件与上次提交到版本库中文件的差异;当暂存区中有文件时,比较当前工作区中文件与暂存区中文件的差异。
git diff --cached
比较暂存区的文件与已经提交过的文件
git diff HEAD~n
比较某个历史版本与工作目录中的文件差异

5、Git检出

git checkout用于Git版本库检出,会重写工作目录,是危险的命令。
git checkout branch
检出branch分支。将HEAD指向branch分支,用branch 的当前目录树更新暂存区和工作目录。

git checkout
git checkout HEAD

显示工作目录、暂存区与HEAD的差异。
git checkout -- filename
用暂存区中filename文件来覆盖工作目录中的filename文件。
git checkout .
用暂存区全部文件覆盖工作目录的全部文件
git checkout -- filename
用暂存区的指定文件覆盖工作目录的指定文件
git checkout HEAD .
用HEAD指向分支中的全部文件覆盖暂存区和工作目录中的文件

git checkout HEAD <file>

用HEAD指向分支中的指定文件覆盖暂存区和工作目录中的文件
git checkout branch -- filename
维持HEAD的指向不变,用branch所指向提交中filename文件覆盖暂存区和工作区中相应的文件。
git checkout commit_id -- file_name
维持HEAD的指向不变,用commit_id,所指向提交中filename文件覆盖暂存区和工作区中相应的文件。

6、Git提交

当git commit命令执行时,将暂存区的所有文件内容在版本库中创建一个持久的快照,然后将当前分支上的HEAD指针移到新创建的快照上。每一次提交会生成一个commit对象,每一个commit对象指向一个tree对象,每个tree对象指向一个文件夹或文件。
git commit -m [message]
提交暂存区到本地仓库
git commit [file1] [file2] ... -m [message]
提交暂存区的指定文件到本地仓库
git commit -a
提交工作区的变化直接到本地仓库,对新文件无效
git commit -v
提交时显示所有diff信息
git commit --amend -m [message]
修订提交,使用一次新的commit,替代上一次提交。如果代码没有任何新变化,则用来改写上一次commit的提交信息
git commit --amend [file1] [file2] ...
重做上一次commit,并包括指定文件的新变化
git revert commit-id
撤回指定版本的内容并提交一个新的commit,不影响之前提交的内容

7、Git日志查看

查看提交日志可以使用git log
git log --graph
以图形化的方式显示提交历史的关系
git reflog
记录仓库中所有的分支的所有更新记录,包括已经撤销的更新。
git log --pretty=oneline
单行显示所有提交日志信息
git log -n
打印最近n次的提交日志信息

8、Git文件查看

git ls-files用于查看指定状态的文件列表
git ls-files
默认查看所有缓存的文件
git ls-files -o
查看未被跟踪的文件
git ls-files --modified
查看被修改的文件
git ls-files -s
查看暂存区中文件详细

9、Git压栈储藏

在实际工程开发中,可能需要紧急修复某个bug,但当前工作目录中工作可能没有完成,需要临时保存,以便清理工作目录,切换到其它分支进行修复。此时,可以使用压栈储藏功能。
git stash
将工作区的所有文件压栈到储藏区
git stash --list
查看压栈储藏区的所有stash列表
git stash pop [stash_id]
从储藏栈弹出栈顶的数据,恢复到工作目录,,可以指定stash_id
git stash drop [stash_id]
将储藏栈栈顶的数据弹出抛弃,可以指定stash_id
git stash apply [--index] [stash_id]
如果执行git stash时工作区的状态是部分文件已经加入暂存区,部分文件没有,当执行git stash apply后会发现所有文件都变成未暂存的,如果想维持原来暂存的文件仍然是暂存状态,可以加上--index参数。可以指定stash_id。
git stash clear
删除储藏栈中所有的数据

10、Git撤销更新

git reset [options] commit_id
git reset命令主要用来根据传递给动作的参数来执行撤销操作。 git reset会使HEAD指向指定的commit_id,一般会用到3个参数,参数会影响到工作区与暂存区中的修改:
--soft: 只改变HEAD的State,不更改工作区与暂存区的内容
--mixed(默认): 撤销暂存区的修改,暂存区的修改会转移到工作区
--hard: 撤销工作区与暂存区的修改

11、Git文件删除

git rm -f filename
删除暂存区、工作目录中的fiename文件
git rm --cached filename
删除暂存区中的filename文件,工作目录中不做修改
对于未跟踪状态的文件,直接删除文件即可

三、Git分支操作

1、Git分支查看

git branch
列出所有本地分支
git branch -r
列出所有远程分支
git branch -a
列出所有本地分支和远程分支

2、Git分支创建

git branch [branch-name]
新建一个branch-name分支,但停留在当前分支
git checkout -b [branch]
新建一个branch分支并切换到该分支
git branch [branch] [commit_id]
新建一个分支,指向指定commit_id提交
git branch --track [branch] [remote-branch]
新建一个分支,并与远程分支建立追踪关系

3、Git分支切换

git checkout [branch-name]
切换到指定分支,并更新工作目录
git checkout -
切换到上一个分支
git branch --set-upstream [branch] [remote-branch]
在现有指定分支与指定的远程分支之间建立追踪关系

4、Git分支合并

git merge用来合并一个或者多个分支到当前分支中,然后将HEAD指针移动到合并结果的提交快照上。
git merge branchname
将branchname分支合并到当前分支
git merge [remote/branch]
合并获取的远程分支到当前分支
git merge –ff branch
使用快进式(fast-forward)合并分支,不会产生新的合并提交快照,是默认合并方式。
git merge –no-ff branch
使用非快进式合并,会创建一个新的合并提交快照
fast-forward:
Git工程开发实践(三)——Git常用操作
no-fast-forwar:
Git工程开发实践(三)——Git常用操作
git cherry-pick [commit]
选择一个commit,合并进当前分支

5、Git变基(衍合)

Git工程开发实践(三)——Git常用操作
当前分支再mywork,当使用git merge将origin分支合并到mywork分支上时,Git创建一个新的提交C7。
Git工程开发实践(三)——Git常用操作
如果使用git rebase将origin分支rebase到mywork分支时,Git会将当前分支mywork分支自分叉提交点(C2)后面的每个提交(commit)拷贝到origin分支后面,并将HEAD指针指向最新的提交点。
Git工程开发实践(三)——Git常用操作
git rebase [startpoint] [endpoint]
将从startpoint到endpoint的多次提×××并为一次提交。
git rebase -i HEAD~3
将最后三次提×××并为一次提交
Git工程开发实践(三)——Git常用操作
git rebase [startpoint] [endpoint] --onto [branchName]
将[startpoint]到[endpoint]开闭区间内的提交复制到[branchName]分支上
此时,当前HEAD处于游离状态,Git只是将C~E部分的提交内容复制一份粘贴到master所指向的提交后面,需要将master所指向的提交id设置为当前HEAD所指向的提交。
git reset --hard commit_id
merge不会修改提交历史,rebase会修改提交历史。 rebase只应用于本地没有提交的代码,不能用于远程分支,get merge可以应用于远程分支。

6、Git分支删除

git branch -d [branch-name]
删除本地分支,-D(大写)强制删除

git push [remote] --delete [branch-name]
git push [remote] :remote-branch
git branch -dr [remote/branch]

删除远程分支

四、Git远程仓库操作

git fetch [remote-name] [branch]
获取仓库中指定分支的更新,但不自动合并当前分支
git fetch [remote-name]
获取仓库所有更新,但不自动合并当前分支
git pull [remote] [remote-branch]:[local-branch]
取回远程主机某个分支的更新,再与本地的指定分支合并
git pull
获取当前分支的唯一远程追踪分支,并自动合并到当前分支
git pull [remote] [branch]
取回远程仓库的branch分支,并与本地当前分支合并
git pull [remote]
获取当前分支的远程仓库追踪分支,并与本地当前分支合并
git pull -p
如果远程主机删除了某个分支,默认情况下,git pull不会在拉取远程分支的时候,删除对应的本地分支。使用参数-p可以在本地删除远程已经删除的分支。
git remote -v
显示所有远程仓库
git remote show [remote]
显示某个远程仓库的信息
git remote add [shortname] [url]
增加一个新的远程仓库,并命名
git remote
简单查看远程所有仓库(只能查看远程仓库的名字)
git remote show [remote-branch-name]
查看单个仓库
git remote add [branchname] [url]
新建远程仓库
git remote rename [oldname] [newname]
修改远程仓库
git remote rm [remote-name]
删除远程仓库

git push [remote] [local-branch]:[remote-branch]
git push [remote] [local-branch]

上传本地指定分支到远程仓库的追踪分支,如果远程分支不存在,则会被新建。
git push [remote] --force
强行推送当前分支到远程仓库,即使有冲突
git push [remote] --all
推送所有分支到远程仓库
git push [remote] :[remote-branch]
删除远程仓库的指定远程分支,等同于:
git push [remote] --delete [remote-branch]

猜你喜欢

转载自blog.51cto.com/9291927/2173507