当前位置:   article > 正文

Hello Git(三)——Git常用操作_libgit2

libgit2

一、Git仓库操作

1、Git仓库创建

git init

在当前目录中初始化Git仓库

git init [project-name]

创建一个新目录并初始化仓库

初始化git仓库会默认创建一个mater分支,创建名为.git的子目录,内含初始化Git仓库中所有的骨干文件,此时仓库中的文件还没有被跟踪。

通过git add命令来实现对指定文件的跟踪,然后执行git commit提交。

  1. git add .
  2. 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文件状态

 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 branchname

检出branch分支。将HEAD指向branch分支,用branch 的当前目录树更新暂存区和工作目录。

  1. git checkout
  2. 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:

 no-fast-forwar:

git cherry-pick [commit]

选择一个commit,合并进当前分支

5、Git变基(衍合)

 当前分支在mywork,当使用git merge将origin分支合并到mywork分支上时,Git创建一个新的提交C7。

 如果使用git rebase将origin分支rebase到mywork分支时,Git会将当前分支mywork分支自分叉提交点(C2)后面的每个提交(commit)拷贝到origin分支后面,并将HEAD指针指向最新的提交点。

git rebase [startpoint]  [endpoint]

将从startpoint到endpoint的多次提交合并为一次提交。

git rebase -i HEAD~3

将最后三次提交合并为一次提交

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(大写)强制删除

  1. git push [remote] --delete [branch-name]
  2. git push [remote] :remote-branch
  3. 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]

删除远程仓库

  1. git push [remote] [local-branch]:[remote-branch]
  2. git push [remote] [local-branch]

上传本地指定分支到远程仓库的追踪分支,如果远程分支不存在,则会被新建。

git push [remote] --force

强行推送当前分支到远程仓库,即使有冲突

git push [remote] --all

推送所有分支到远程仓库

git push [remote] :[remote-branch]

删除远程仓库的指定远程分支,等同于:

git push [remote] --delete [remote-branch]

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/201475
推荐阅读
相关标签
  

闽ICP备14008679号