Git入门

Git入门

Reference

廖雪峰的官方网站中的git教程

猴子都能懂的git入门

基本操作

初始化git仓库

git init

注意只有在git目录下有效。

1
2
3
4
# 以创建空目录“learngit”为例
$ mkdir learngit
$ cd learngit
$ git init

文件放入git仓库

  • git add <file>

    可反复多次使用,添加多个文件;

  • git commit -m <message>

1
2
3
4
5
6
7
# 首先将文件放到当前目录(或者其子目录下)
# 以readme.txt为例
$ git add readme.txt # 可反复使用以提交多个文件
$ git commit -m "wrote a readme file"
[master (root-commit) eaadf4e] wrote a readme file
1 file changed, 2 insertions(+)
create mode 100644 readme.txt

查看工作区状态

git status

查看文件修改内容

git diff

1
2
3
4
5
6
7
8
9
10
11
$ git diff HEAD -- readme.txt 
diff --git a/readme.txt b/readme.txt
index 76d770f..a9c5755 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,4 +1,4 @@
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
-Git tracks changes.
+Git tracks changes of files.

版本回退

  • HEAD指向的版本就是当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,可以写成HEAD~100

  • git log
    查看提交历史

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    $ git log
    commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)
    Author: Michael Liao <askxuefeng@gmail.com>
    Date: Fri May 18 21:06:15 2018 +0800

    append GPL

    commit e475afc93c209a690c39c13a46716e8fa000c366
    Author: Michael Liao <askxuefeng@gmail.com>
    Date: Fri May 18 21:03:36 2018 +0800

    add distributed

    commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
    Author: Michael Liao <askxuefeng@gmail.com>
    Date: Fri May 18 20:59:18 2018 +0800

    wrote a readme file

    加上--pretty=oneline参数进行简化

    1
    2
    3
    4
    $ git log --pretty=oneline
    1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append GPL
    e475afc93c209a690c39c13a46716e8fa000c366 add distributed
    eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote a readme file
  • git reflog

    查看命令历史

    1
    2
    3
    4
    5
    $ git reflog
    e475afc HEAD@{1}: reset: moving to HEAD^
    1094adb (HEAD -> master) HEAD@{2}: commit: append GPL
    e475afc HEAD@{3}: commit: add distributed
    eaadf4e HEAD@{4}: commit (initial): wrote a readme file
  • git reset --hard commit_id

    回退到指定版本,commit_id可以通过git log查询。

    1
    2
    $ git reset --hard 1094a
    HEAD is now at 83b0afe append GPL

    特殊地,$ git reset --hard HEAD^可以回到上一个版本。

    1
    2
    $ git reset --hard HEAD^
    HEAD is now at e475afc add distributed撤销

撤销修改

  • 想直接丢弃工作区的修改时,用命令git checkout -- file

    git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

    1
    2
    3
    4
    5
    $ git checkout -- readme.txt

    $ git status
    On branch master
    nothing to commit, working tree clean
  • 改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改

    第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作。

    1
    2
    3
    $ git reset HEAD readme.txt
    Unstaged changes after reset:
    M readme.txt
  • 已经提交了不合适的修改到版本库时,想要撤销本次提交

    版本回退

删除文件

删除文件后:

  • 确实希望删除

    git rm git commit -m

    1
    2
    3
    4
    5
    6
    7
    $ git rm test.txt
    rm 'test.txt'

    $ git commit -m "remove test.txt"
    [master d46f35e] remove test.txt
    1 file changed, 1 deletion(-)
    delete mode 100644 test.txt
  • 误删,希望恢复

    1
    $ git checkout -- test.txt

远程库连接

push

新建仓库后,看到页面:

image-20220802203838527

按照github的提示:

1
2
3
git remote add origin https://github.com/thunderbolt215/test_git.git
git branch -M main
git push -u origin main

此后提交文件只需要:

1
$ git push origin master

解除和远程库关系

git remote -v查看远程库信息:

1
2
3
$ git remote -v
origin git@github.com:michaelliao/learn-git.git (fetch)
origin git@github.com:michaelliao/learn-git.git (push)

然后,根据名字删除,比如删除origin

1
$ git remote rm origin

此处的“删除”其实是解除了本地和远程的绑定关系,并不是物理上删除了远程库,远程库本身并没有任何改动。

要真正删除远程库,需要登录到GitHub,在后台页面找到删除按钮再删除。

克隆

要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。

Git支持多种协议,包括https,但ssh协议速度最快。

1
2
$ git clone git@github.com:michaelliao/gitskills.git # ssh协议
$ git clone https://github.com/thunderbolt215/test_git.git # https协议

这部分如果出现拒绝访问等错误可以尝试:

2022-8-2 学到分支管理


分支管理

简单图示

初始状态

git-br-initial

创建新分支

git-br-create

dev分支下添加内容

git-br-dev-fd

合并

git-br-ff-merge

删除dev分支

git-br-rm

基本操作

查看分支:git branch

创建分支:git branch <name>

切换分支:git switch <name>(git checkout <name>)

创建+切换分支:git switch -c <name>(git checkout -b <name>)

合并某分支到当前分支:git merge <name>

删除分支:git branch -d <name>

分支合并图:git log --graph

查看远程仓库信息:

git remote -v显示更详细的信息:

1
2
3
$ git remote -v
origin https://github.com/thunderbolt215/test_git.git (fetch)
origin https://github.com/thunderbolt215/test_git.git (push)

显示了可以抓取和推送的origin的地址

冲突

当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。

解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。

示例:

创建新分支feature1,提交相应修改;然后切换到main分支,提交修改:

git-br-feature1

此时无法直接合并,产生冲突。

解决冲突需要将文件修改后保存,此时分支示意图:

git-br-conflict-merged

最后删除feature1分支即完成。

管理策略

首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;

dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;

你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

所以,团队合作的分支看起来就像这样:

7

合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

bug分支【没看懂】

feature分支

开发一个新feature,最好新建一个分支。

如果要丢弃一个没有被合并过的分支(即执行过了git commit但是还没git merge),可以通过git branch -D <name>强行删除。

push

推送时指定本地分支:(main 为例)

1
$ git push origin main

2022-8-3 学到标签管理


零碎知识点

版本控制系统只能跟踪文本文件

  • 只能跟踪纯文本文件的改动
  • word格式是二进制格式,因此,版本控制系统是没法跟踪Word文件的改动的
  • windows下采用记事本编辑文件会出问题,应该采用vscode

工作区和暂存区

  • 工作区

working-dir

  • 暂存区

工作区的隐藏目录.git是git的版本库,其中有暂存区(stage)

git-repo

git add:把要提交的所有修改放到暂存区

git-stage

git commit:一次性把暂存区的所有修改提交到分支

git-stage-after-commit


Git入门
http://example.com/2022/12/17/Git入门/
作者
Thunderbolt
发布于
2022年12月17日
许可协议