git基础知识,常用指令

pwd:显示当前路径 git init 把当前文件夹作为一个git repository 图片,视频等文件没法跟踪文件的变化,git只能跟踪文本文件的的改动

git add . 添加所有修改到暂存区 git commit 提交暂存区的文件到本地版本库 git log 获取版本提交信息 git reset –hard head^ 返回上一个版本 git reset –hard b0301f8 返回制定版本 git reflog 记录你的每一次命令 git diff readme.txt :查看文件修改的哪些内容 命令git checkout – readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次git commit或git add时的状态。 git checkout – gitzl.txt 回复删除的修改

git push -u origin master: push到远处仓库 git remote -v git remote add upstream git@gitlab.cqrd.com git pull upstream dev

git push –force

ssh-keygen -t rsa -C “569484515@qq.com” 本地产生 ssh秘钥

git clone git@github.com:yates622/gittest.git

git checkout -b dev :创建并切换分支

git merge dev:合并dev分支到当前分支

创建分支:git branch

git branch -D 强行删除

git tag v0.9 切换到当前分支创建标签 git tag v0.9 6224937 在指定分支上面创建标签 git show 查看标签信息

命令git push origin 可以推送一个本地标签;

命令git push origin –tags可以推送全部未推送过的本地标签;

命令git tag -d 可以删除一个本地标签;

命令git push origin :refs/tags/可以删除一个远程标签。

git add 这一操作在目录 .git/objects/ 新建一个BLOB(binary large object 二进制大对象)文件, 将一个文件添加到 Git 中时 Git 是如何将文件的内容保存到 objects 目录中的。即便用户从工作副本中删除文件 data/letter.txt ,它的内容在 Git 库中也是安全的。 将文件添加到索引中。索引是一个包含所有 Git 所要跟踪文件的列表。它以文件 .git/index 保存 git ls-files –stage 查看索引文件

git commit 1.Git 通过从索引建立一张树图来记录项目的当前状态。这张树图记录了项目中每一个文件的位置和内容。 2.在创建树图之后创建一个提交对象, .git/HEAD 目录中的 HEAD 文件中寻找相关信息 3.最后,提交命令将当前分支指向新的提交对象。

创建一个分支: ~/alpha $ git branch deputy 用户创建了一个新的叫做 deputy 的分支。这个操作在 .git/refs/heads/deputy 目录下创建了新文件,其包含了 HEAD 指向的散列值:a3 提交的散列值。

图属性:分支其实就是引用,而引用其实就是文件。这也就是说 Git 的分支是很轻量的。

检出分支: 首先, Git 找到’master’分支所指向的a2提交对象并获取该提交对象所指向的树对象.

接下来 Git 会将树对象储存的文件写到当前工作副本中, 该操作将覆写data/number.txt为2.

第三步, Git 将树对象中的文件入口写入 index, data/number.txt的文件入口将会被更新为2 blob 的 hash 值

最后 Git 通过将HEAD中的 hash 值替换为如下内容来使HEAD指向master分支:

合并一个祖先分支: [图属性]: 图示中的一系列提交对象可以被认为是对仓库内容进行的一些列更改. 因此在一次合并当中, 若想要并入的分支是当前分支的祖先分支, Git不会执行任何操作, 因为想要并入分支中的改动已经被包含在了当前分支中.

合并后代提交: 图属性:图中的提交系列被视为对仓库内容的一系列更改。这意味着,如果赠予提交是接收提交的后代提交,提交历史不会变。已经存在一序列提交来描述赠予提交和接收提交之间的变化。 但是尽管 Git 历史不变,Git 的状态图是会改变的。HEAD 指向的具体引用会更新以指向赠予提交。

合并不同提交线的两个提交: 第一步,Git 将接收提交的哈希值写入文件 alpha/.git/MERGE_HEAD。此文件的存在说明 Git 正在做合并操作。

第二步,Git 查找基提交:即接收提交和赠予提交共有的一个最近父提交。

<code>a3</code>, the base commit of <code>a4</code> and <code>b3</code>
a3 是 a4 和 b3 的基提交

图属性:每个提交都有一个父提交。这意味着我们可以发现两个提交线分开自哪个提交。Git 查找 b3 和 a4 的所有祖先提交,发现了最近的公共父提交 a3,即为他们的基提交。

第三步,Git 为基提交、接收提交和赠予提交创建索引。

第四步,Git 产生接收提交和赠予提交相对于基提交的 diff,此处的 diff 是一个文件路径列表,指向一个变化:包括添加、移除、修改或冲突。

Git 获取基提交、接收提交和赠予提交的文件列表,针对每一个文件,通过对比 index 来判断它的状态与写入变更。它将对应条目写入 diff。在这个例子中,diff 包含两个条目。

第一项记录 data/letter.txt 的状态。该文件内容分别是基提交中的 a 、接收提交中的b和赠予提交中的a。文件内容在基提交和接收提交不同,但在基提交和赠予提交相同。Git 发现文件内容被接收提交修改了,而不是在赠予提交中。data/letter.txt 的状态是修改,而不是冲突。

第二项记录 data/number.txt 的变更。在这个例子中,该文件内容在基提交和接收提交中是相同的,但在基提交和赠予提交是不同的。 data/number.txt 条目的状态也是修改。

图属性:查找一个合并操作的基提交是可行的。这意味着,如果基提交中的一个文件只在接收提交或赠予提交做了修改,Git 可以自动除了合并文件,这样就减少了用户的工作量。

第五步,Git 将差异中的项被应用到工作区。data/letter.txt 内容被修改为b,data/number.txt 内容被修改为 4。

第六步,Git 将差异中的项应用到 index。data/letter.txt 会指向内容为 b 的 blob,data/number.txt 会指向内容为 4 的 blob。

第七步,更新后的 index 被提交:

tree 20294508aea3fb6f05fcc49adaecc2e6d60f7e7d parent 982dffb20f8d6a25a8554cc8d765fb9f3ff1333b parent 7b7bd9a5253f47360d5787095afc5ba56591bfe7 author Mary Rose Cook mary@maryrosecook.com 1425596551 -0500 committer Mary Rose Cook mary@maryrosecook.com 1425596551 -0500

b4 注意,这个提交有两个父提交。

第八步,Git 将当前分支 deputy 指向新提交。

合并不同提交线且有相同修改文件的两个提交: 第五步,差异列表中的文件被写入工作区。对于冲突的部分,Git 将两个版本都写入工作区的文件中。data/number.txt 的内容被变更为:

第六步,差异列表中的文件被写入 index。index 中的项被文件路径和 stage 的组合唯一标识。没有冲突的项 stage 为 0。在该合并前,index 看起来像下面的样子,标有 0 的是 stage 值:

删除文件: Git 删除 data/letter.txt。 文件将从工作副本中删除,该文件的入口也将从索引中消失。 Git 会在提交时构建一张树图代表索引内容,data/letter.txt 并不会出现在树中,因为它不在索引里。 复制一个库:

链接至另一个库: ~ $ cd alpha ~/alpha $ git remote add bravo ../bravo 用户回到 alpha 库中,设置 bravo 为一个 alpha 的远程库,这会使 alpha/.git/config 多了这几行:

[remote “bravo”] url = ../bravo/ 拉取远程仓库: ~ /alpha $ git pull bravo master Already up-to-date. 拉取远程仓库 bravo 的 master 分支到本地仓库 alpha。pull 操作是 “获取然后合并FETCH_HEAD “ 这两个命令的一个快捷方式。执行了这个命令后,反馈 Already up-to-date, 说明本地和远程内容一样。 克隆一个仓库 ~/alpha $ cd .. ~ $ git clone alpha charlie Cloning into ‘charlie’ 切换到 alpha 的上级目录,克隆仓库alpha 到目录 charlie,这个操作的结果,如同通过复制到到bravo仓库。

克隆仓库做的事情包括:创建新目录charlie; 在目录charlie下初始化仓库;将 alpha 作为远程仓库的 origin分支; 获取 origin 分支到本地;合并分支 FETCH_HEAD。
由于一次推送操作会更新远程索引和 HEAD的指向,如果这个时候有人正在编辑远程副本的时候,就会导致冲突,出现不一致。