用 git 和 gitee管理你的代码

----------------------------------------------------------------------------------------------------
-----------------写在前面的准备工作-------------------------------------------
-----------------------------------------------------------------------------------------------------
如果你还没有安装git,请下载安装,百度一下 Git 安装与使用,很多教程。
下载下来,然后 下一步 下一步就安装完了。很简单。

说明一下 Git 和 gitee 是两个不同的东西。
你可以这样简单理解,git是管本地的代码, gitee是一个云代码存储器。
本人也是菜鸟,有错误大家指正。

本人也是菜鸟,有错误大家指正。

本人也是菜鸟,有错误大家指正。

----------------------------------------------------------------------------------------------------
-----------------Git 全局设置-------------------------------------------
-----------------------------------------------------------------------------------------------------
git config --global user.name"gitee的账户名'
------如果你用github,是github的账户名。我没用过github配置过
git config --global user.email "[email protected]'
------这个是gitee绑定的邮箱,登录你的gitee,查一个人资料能看到。

----------------------------------------------------------------------------------------------------
-----------------从git init 到 新建文件 后 push-------------------------------------------
-----------------------------------------------------------------------------------------------------
一,初始化
git init

二,创建一个远程仓库, 这个意思容易误会。实际是在本地创建一变量,指向仓库的地址。 相当于给 远程仓库地址起个别名。
git remote add origin https://gitee.com/tomatoiot/git-test.git
----在本地创建一个 origin的仓库变量名。这个变量指向 gitee的https://gitee.com/tomatoiot/git-test.git ,这个地址是一个gitee的一个仓库

三,用 git config --list  查看一下配置,可以看到已经将本地的origin绑定了 url 和 fetch

remote.origin.url=https://gitee.com/tomatoiot/git-test.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*

四,绑定 fetch后,下面就用git fetch将远程所有分支取回来。

D: estd1>git fetch
remote: Enumerating objects: 70, done. 
remote: Counting objects: 100% (70/70), done.
remote: Compressing objects: 100% (56/56), done.
remote: Total 70 (delta 25), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (70/70), 7.41 KiB | 55.00 KiB/s, done.
From https://gitee.com/tomatoiot/git-test
 * [new branch]      dev        -> origin/dev
 * [new branch]      master     -> origin/master

------------这两行代码已经将两个分支取回来本地-----------------------
 * [new branch]      dev        -> origin/dev
 * [new branch]      master     -> origin/master
--------------------------------------------------------------------

五,用git checkout master 切换到指定的分支,自然就将文件加载出来了
 D: estd1>git checkout master
Already on 'master'
branch 'master' set up to track 'origin/master'.

六,再用 git checkout dev 换到dev 分支试试。
D: estd1>git checkout dev
Switched to a new branch 'dev'
branch 'dev' set up to track 'origin/dev'.

可以看到,dev 分支的文件也出来了。

七,在dev 分支中 加一个 1-dev-4.txt文件,然后push到 gitee的dev分支上。
1)echo  dev-4 >1-dev-4.txt -----这句的cmd命令,创建一个文件 1-dev-4.txt,内容为:dev-4
2)git add .   ------将所有的变化文件添加到git的本地的暂存区
D: estd1>git add .
3)用git stauts  查一下暂存区未commit 的内容
D: estd1>git status
On branch dev
Your branch is up to date with 'origin/dev'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   1-dev4.txt
-------------------------这里告诉我们,新加了一个文件 1-dev4.txt, 可用git restore --staged <file>来取消暂存

4)我们执行 git restore试试
D: estd1>git restore --staged .

D: estd1>git status
On branch dev
Your branch is up to date with 'origin/dev'.

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

nothing added to commit but untracked files present (use "git add" to track)

可以看到暂存区已经没有东西,用git status查,提示已经变成: git add ,告诉我们用git add将 1-dev4.txt 存到暂存区。
这里要提一下,暂存区的作用,因为 commit 有版本号。暂存区是将每一次的修改,随手就添加到暂存区,然后一次性用 commit 加上版本备注,提交到代码仓库。

5)下面我们再将执行 git add . 将 1-dev4.txt放到暂存区
D: estd1>git add .

6)git commit -m "new dev-4.txt" ----将暂存区的东西一次性提交到本地仓库。
D: estd1>git commit -m "new dev-4.txt"
[dev e43a268] new dev-4.txt
 1 file changed, 1 insertion(+)
 create mode 100644 1-dev4.txt

7)我们执行一下 git status,可看到提示,有一个commit 未 push 到远程仓库,即是gitee.
D: estd1>git status
On branch dev
Your branch is ahead of 'origin/dev' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

这个时候,如果我们执行 git push,就会将所有没push的commit更新到gitee了。
但是我暂不做这一步。先演示一下,这个时候,我想后悔了怎么办。

8)用 git cherry -v 查询一下,有多少commit没有push到远程仓库。
D: estd1>git cherry -v
+ e43a268e60d5dae0a60cdaaa74345c1f77be89d8 new dev-4.txt
可以 看到一个有ID:+ e43a268e60d5dae0a60cdaaa74345c1f77be89d8 的文件没push.

9) 我们也可以 用 git log查看 所有的commit记录,主要用于版本还原,也就是上面说的后悔了怎么办。 
git log 回退到命令行,按【Q】  键。
git log 回退到命令行,按【Q】  键。
git log 回退到命令行,按【Q】  键。

D: estd1>git log
commit e43a268e60d5dae0a60cdaaa74345c1f77be89d8 (HEAD -> dev)
Author: TomatoIot <[email protected]>
Date:   Sun Jan 21 23:19:44 2024 +0800

    new dev-4.txt

-------------------这只是部分的commit记录。上面这一条就是我们最后一次提交的。
-------------------现在我要后悔,可以用D: estd1>git reset <commit ID>

commit 64a175af1731f8918e727f419af04a300f41af1d (origin/dev)
Author: TomatoIot <[email protected]>
Date:   Thu Jan 18 12:54:06 2024 +0800

    在dev 第三次提交 修改了1-dev-3的内容

commit 12e7f2ccf73486b146e0d9745a1a7377e9b390ad
Author: TomatoIot <[email protected]>
Date:   Thu Jan 18 12:46:28 2024 +0800

    在dev分支修改1.txt文件,测试下跟master合并同一个文件

10)用git reset <commit ID> 还原commit 和 暂存区,但工作区不变。注意不能用这个: git reset --hard commit ID ,这个会将工作区也还原了。
详细看这个文章:https://blog.csdn.net/weixin_43857653/article/details/130423625
我现在要还原到 new dev-4.txt的上一个commit,
也就是这个ID:64a175af1731f8918e727f419af04a300f41af1d

D: estd1>git reset 64a175af1731f8918e727f419af04a300f41af1d

11)我们用 git log 和 git cherry -v查一下,名为:new dev-4.txt 的最后一次提交是不是没有了。
D: estd1>git cherry -v

可以看到是没有返回值,证明没有东西需要 push.

12) 再用git log查一下,看看 
commit e43a268e60d5dae0a60cdaaa74345c1f77be89d8
即 名为:new dev-4.txt 的最后一次提交
还存不存在。

D: estd1>git log
commit 64a175af1731f8918e727f419af04a300f41af1d (HEAD -> dev, origin/dev)
Author: TomatoIot <[email protected]>
Date:   Thu Jan 18 12:54:06 2024 +0800

    在dev 第三次提交 修改了1-dev-3的内容
-----------------------------可以看到第一条已经变为 64a175af1731f8918e727f419af04a300f41af1d 了。
名为:new dev-4.txt 的最后一次提交   已经没有了。 

commit 12e7f2ccf73486b146e0d9745a1a7377e9b390ad
Author: TomatoIot <[email protected]>
Date:   Thu Jan 18 12:46:28 2024 +0800

    在dev分支修改1.txt文件,测试下跟master合并同一个文件

commit a84e61dbe7c250aa55e3711ad8c36299f08f0fab
Author: TomatoIot <[email protected]>
Date:   Thu Jan 18 12:07:30 2024 +0800

    third commit dev

八,我们重新执行 git add .  和 commit ,   用于测试 还原 暂存区 + 工作区的 不可逆方法: git reset --hard commit ID  ----【慎用,慎用】

D: estd1>git add .
D: estd1>git commit -m "new dev-4.txt"

九,执行 git reset --hard commit ID
D: estd1>git reset --hard 64a175af1731f8918e727f419af04a300f41af1d
HEAD is now at 64a175a 在dev 第三次提交 修改了1-dev-3的内容
--------可以看到工作区的 dev-4.txt文件都不见了

十,执行 git log 查一下 
D: estd1>git log
commit 64a175af1731f8918e727f419af04a300f41af1d (HEAD -> dev, origin/dev)
Author: TomatoIot <[email protected]>
Date:   Thu Jan 18 12:54:06 2024 +0800

    在dev 第三次提交 修改了1-dev-3的内容
-----------------------------可以看到第一条已经变为 64a175af1731f8918e727f419af04a300f41af1d 了。
名为:new dev-4.txt 的最后一次提交   已经没有了。

commit 12e7f2ccf73486b146e0d9745a1a7377e9b390ad
Author: TomatoIot <[email protected]>
Date:   Thu Jan 18 12:46:28 2024 +0800

    在dev分支修改1.txt文件,测试下跟master合并同一个文件

十一,我们重新执行 echo dev4 > 1-dev4.txt   ,  git add .  和 commit  测试后面的 Push到 gitee

D: estd1>echo dev4 > 1-dev4.txt
D: estd1>git add .
D: estd1>git commit -m "new dev-4.txt"
[dev df1942e] new dev-4.txt
 2 files changed, 1 insertion(+)
 create mode 100644 1-dev4.txt
 create mode 100644 git

十二,执行git push 正式提交代码到远程gitee的仓库。去gitee网页看看,就能看到1-dev4.txt文件了。

D: estd1>git push
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 20 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 286 bytes | 286.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.4]
To https://gitee.com/tomatoiot/git-test.git
   64a175a..df1942e  dev -> dev

创建文件 到 push到远程 gitee仓库完成讲解。

----------------------------------------------------------------------------------------------------
-----------------在本次新建 分支,然后用CMD指令创建gitee的分支,
-----------------并且将本地分支和远程gitee分支绑定 监控变化--------------------
-----------------------------------------------------------------------------------------------------
一,用 git branch <分支名>新建本地分支
D: estd1>git branch product

二,用git branch 查一下是不是创建成功
D: estd1>git branch
* dev
  master
  product

这个时候可以 add,可以 commit ,但不能push ,知道为什么吗,因为远程的gitee还没有这个分支。
我们试试 push.

三,切换到 product分支
D: estd1>git checkout product
Switched to branch 'product'

四:先新建一个文件 echo dev5 > 1-dev5.txt   ----用于测试,并执行 add . 和 commit,都没问题。
D: estd1>echo dev5 > 1-dev5.txt

D: estd1>git add .

D: estd1>git commit -m "new 1-dev5.txtd"
[product c79c9d5] new 1-dev5.txt
 1 file changed, 1 insertion(+)
 create mode 100644 1-dev5.txt

四:执行 add . 和 commit,都没问题,我们试下push,报错。知道为什么吗,因为远程的gitee还没有这个分支。
D: estd1>git push
fatal: The current branch product has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin product

To have this happen automatically for branches without a tracking
upstream, see 'push.autoSetupRemote' in 'git help config'.

五,执行git push --set-upstream origin product,建立远程分支,并绑定本地分支,实现监听。同时将所有文件,包括新建的 new 1-dev5.txt都push上去

D: estd1>git push --set-upstream origin product
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 20 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 272 bytes | 272.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.4]
remote: Create a pull request for 'product' on Gitee by visiting:
remote:     https://gitee.com/tomatoiot/git-test/pull/new/tomatoiot:product...tomatoiot:master
To https://gitee.com/tomatoiot/git-test.git
 * [new branch]      product -> product
branch 'product' set up to track 'origin/product'.

六,我们试下再新建一个 product.txt 文件,直接push上去也没问题。
D: estd1>git add .

D: estd1>git commit -m "new produtc1.txt"
[product 0675293] new produtc1.txt
 1 file changed, 1 insertion(+)
 create mode 100644 1-product1.txt

D: estd1>git push
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 20 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 280 bytes | 280.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.4]
To https://gitee.com/tomatoiot/git-test.git
   c79c9d5..0675293  product -> product

----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------
【git checkout commit ID】下面是介绍 git checkout commit ID,如下。用于试验性修改。暂时没想到用处。

一,执行 git checkout commit ID,如下。用于试验性修改
正在Git的“分离的HEAD”状态。在这种状态下,你不在任何分支上,你的HEAD指针指向一个特定的提交。 
注意:(用checkout commit ID之后,你所在的分支是不属于任何一个分支,必须用checkout <分支名> 重新进入分支)
D: estd1>git checkout 64a175af1731f8918e727f419af04a300f41af1d
Note: switching to '64a175af1731f8918e727f419af04a300f41af1d'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false

HEAD is now at 64a175a 在dev 第三次提交 修改了1-dev-3的内容

二,执行 一下 git branch 看一下是不是现在不属于任何分支:
D: estd1>git branch
* (HEAD detached at 64a175a)
  dev
  master

----------------------你看*号不标在 dev 也不标记在 master上。

三,你正在Git的“分离的HEAD”状态。在这种状态下,你不在任何分支上,你的HEAD指针指向一个特定的提交。

这个状态通常在你直接使用提交的SHA值切换到特定的提交时出现,或者在创建新的分支时也会进入这个状态。

在分离的HEAD状态下,你可以进行一些操作,例如查看文件、进行实验性的更改和提交等。但是,这些提交不会出现在任何分支上,除非你创建一个新的分支来保留这些提交。

如果你想保留这些实验性的更改,并希望将这些更改加入到一个新的分支,你可以使用git switch -c命令创建一个新分支:
git switch -c <new-branch-name>

如果你想返回到之前的分支,可以使用git checkout命令:

四,执行一下 git checkout dev ,回到dev 上。