wys的个人博客

你有很多事放不下?做人要潇洒一点~

0%

Version Control (Git)

Version Control (Git)

git init创建仓库

1
2
git init
Initialized empty Git repository in /home/rust/missing/playgroud/demo/.git/

git help 查看帮助,后面要加上参数,比如说git init

我们创建一个文件。

1
echo "hello world" > hello.txt

这个时候查看 git status

1
2
3
4
5
6
No commits yet

Untracked files:
(use "git add <file>..." to include in what will be committed)

hello.txt

我们可以看到一个`Untracked files 。

然后git add hello.txt

1
2
3
4
5
6
7
8
9
10
git status

On branch master

No commits yet

Changes to be committed:
(use "git rm --cached <file>..." to unstage)

new file: hello.txt

输入 git commit 我们可以看到commit message for your changes

\image-20220330150554475.png)

然后我们可以在最上方输入git commit 的提交信息。

以下连接可以对编写提交信息有所帮助:

1
2
3
[master (root-commit) c67b17d] Add hello.txt`
1 file changed, 1 insertion(+)
create mode 100644 hello.txt

然后就提示了相关信息。

1
git log

以上信息可以查看commit history

我们可以用 git cat-file -p 来查看 commit 的相关内容。

例如上述提交我们得到的hash值是 c67b17d

1
2
3
4
5
6
git cat-file -p c67b17d
tree 68aba62e560c0ebc3396e8ae9335232cd93a3f60
author wys <1377030423@qq.com> 1648623855 +0800
committer wys <1377030423@qq.com> 1648623855 +0800

Add hello.txt`

我们可以得到相关信息。

我们再对 68aba62e560c0ebc3396e8ae9335232cd93a3f60 进行git cat-file -p ,可以查看更详细的信息。

1
2
 git cat-file -p 68aba62e560c0ebc3396e8ae9335232cd93a3f60
100644 blob 3b18e512dba79e4c8300dd08aeb37f8e728b8dad hello.txt

我们再对 3b18e512dba79e4c8300dd08aeb37f8e728b8dad 进行git cat-file -p ,可以查看文件内容。

1
2
 git cat-file -p 3b18e512dba79e4c8300dd08aeb37f8e728b8dad
hello world

git log 展示的信息非常的抽象不易于查看,我们可以通过以下命令,进行图形化的查看

1
git log --all --graph --decorate

很遗憾由于我们的提交只有一次,所以和之前没什么区别。

我们新添加一些内容。

\image-20220330165942312.png)

再次输入以下信息:

1
git log --all --graph --decorate

\image-20220330170052069.png)

我们可以查看图形化的提交结果。

我们可以通过 git checkout 改变当前仓库的状态。

例如:

1
2
git checkout c67b17d1
Note: checking out 'c67b17d1'.

此时我们再查看当前的文件,就可以发现文件内容为第一次提交时的内容。

1
2
cat hello.txt
hello world

\image-20220330171952070.png)

HEAD 指针也移到了第一个状态。

1
2
3
4
5
6
7
git checkout master
Previous HEAD position was c67b17d Add hello.txt`
Switched to branch 'master'

cat hello.txt
hello world
another line

git checkout master 可以使用别名回到最新的状态。

git diff可以查看文件和当前状态文件的差别,加上hash码可以查看和指定文件的差别。

1
git diff hello.txt

\image-20220330173517557.png)

1
git diff c67b17d1 hello.txt

\image-20220330173628255.png)

git checkout <文件> 会丢弃文件中修改的内容,然后将文件的内容变为HEAD指针所指向的内容

git branch 可以查看当前有哪些分支。--vv参数可以显示更多的信息。

git branch <分支名> 可以新建分支。

1
git branch cat

\image-20220330182825930.png)

可以看到新建了一个分支cat

1
2
 git checkout cat
Switched to branch 'cat'

HEAD 指针指向cat分支

\image-20220330183109402.png)

做一些修改然后提交

\image-20220330183702033.png)

可以看到cat分支往前走了一个节点。

1
git log --all --graph --decorate --oneline

\image-20220330184446862.png)

我们继续创建分支,可以看到现在已经有两个分支。

\image-20220330185418461.png)

我们接下来对两个分支进行合并。

1
2
3
4
5
6
7
8
9
10
11
12
13
git checkout master
Switched to branch 'master'

git merge cat
Updating 6bf6674..09a8ebb
Fast-forward
animal.py | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)

git merge dog
Auto-merging animal.py
CONFLICT (content): Merge conflict in animal.py
Automatic merge failed; fix conflicts and then commit the result.

merge cat的时候一切正常,merge dog的时候出现冲突。

我们编辑文件,可以看到冲突部分如下:

\image-20220330190706456.png)

修改如下:

\image-20220330191534744.png)

然后就可以正常进行merge

\image-20220330191655673.png)

可以看到完成了合并。

\image-20220330191801124.png)

远端操作

  • git remote: 列出远端

  • git remote add <name> <url>: 添加一个远端

    这里的name是远程仓库的名字,一般都是origin,这里的url可以是本地地址,比如说../remote

    需要注意的是远程仓库的创建要用git init --bare

    1
    git add origin ../remote
  • git push <remote> <local branch>:<remote branch>: 将对象传送至远端并更新远端引用

    1
    git push origin master:master

    image-20220330195829301/image-20220330195829301.png)

    之后git log就可以看到远程仓库的状态

  • git branch --set-upstream-to=<remote>/<remote branch>: 创建本地和远端分支的关联关系

    例如 git branch —set-upstream-to=origin/master

    以后就可以直接git push

    git branch -vv 可以看到当前分支绑定了哪个远端分支

    image-20220330204316997/image-20220330204316997.png)

  • git fetch: 从远端获取对象/索引
  • 给i他git pull: 相当于 git fetch; git merge
  • git clone: 从远端下载仓库

Git 高级操作

  • git config: Git 是一个 高度可定制的 工具

  • git clone --depth=1: 浅克隆(shallow clone),不包括完整的版本历史信息

    如果版本历史信息过大,可以使用这个命令,也可以直接 git clone —shallow

  • git add -p: 交互式暂存

    这个命令可以保留一些你想要的更改,忽略一些你不需要的更改(比如debug信息)。

  • git rebase -i: 交互式变基

  • git blame: 查看最后修改某行的人

    后面加文件名。出来的信息前面会有hash值,git show hash值可以查看详细信息。

  • git stash: 暂时移除工作目录下的修改内容

    git stash pop 可以取消撤销

  • git bisect: 通过二分查找搜索历史记录

  • .gitignore: 指定 故意不追踪的文件