Git Advanced

1 git仓库的连接

1.1 本地添加远程仓库链接

git init
git branch -M main
git remote add origin git@github.com:xiaobai-171/*.git

1.2 直接克隆远程仓库

git clone url

1.3 个人实验记录

之前都是使用git clone http的方式从远程仓库中获得版本库,从而可以不进行远程仓库的连接这一过程。我对此进行了探究 :
1、git remote add name learn-gitlab添加远程仓库
2 、git在这之前已经完成了add的操作(提交到暂存区中),commit的操作(将暂存区的代码提交到了本地版本库.git中)
3、git push --set-upstream name 分支名即可这是使用http的方式进行连接,我需要进行账号、密码的登录。

2024-11-08 回答:在 github 新建仓库时,有如何连接该仓库和本地文件夹

实际上,使用ssh进行的话,可以不需要进行验证。 原理在于:所谓"公钥登录"。 原理很简单,就是用户将自己的公钥储存在远程主机上。 登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。 远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。 目前暂时没有实现ssh连接,主要是因为ssh://git@ip:port/仓库路径 的ip和端口我不知道怎么得,得了能不能还不好说。
2022/1/15晚 曾志存

2024-03-21 回答:ssh:// git@ip : port/仓库路径在 github中可以轻松获得,使用ssh进行clone,有时甚至能获得几倍的网速(在http网速异常时), 其最重要在于免验证

2 分支

2.1 合并冲突

正常合并会是这样

$ git checkout master
Switched to branch 'master'
$ git merge issue2
Updating b2b23c4..8f7aa27
Fast-forward
 myfile.txt |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

当同一行被多个分支修改时,会出现合并冲突
Pasted image 20230326205853.png|500

要处理git中的合并冲突,有以下几个步骤:

2.2 快进合并

不保留分支记录,直接快进,仿佛这一条分支没有发生过。
Pasted image 20230326211547.png

2.3 分支切换

git checkout branch_name
分支切换

2.4 分支变基

git rebase
Pasted image 20240321120406.png

3 删除文件

直接删除文件不建议进行,这样版本库的信息未更新,git会认为含有这个文件,会有up to date的奇怪正常。

?真的假的

4 回档文件

git reset --hard HEAD~

Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,回退2个版本写成HEAD~2。也可以查询版本 :Git log pretty =oneline 显示出所有提交版本记录,选择 id 执行 git rest --hard id即可。

git reset 中^的使用方法
^是在指定父节点,~才是回退

Untitled.png

5 git标签

git tag -a <tagname>

git tag -am "连猴子都懂的Git" banana

如果在tag命令指定-n选项执行,可以显示标签的列表和注解。

$git tag -n
apple           first commit
banana          连猴子都懂的Git

6 git日志

如果在log命令添加 --decorate选项执行,可以显示包含标签资料的历史记录。

$git log --decorate
commit e7978c94d2104e3e0e6e4a5b4a8467b1d2a2ba19 (HEAD, tag: apple, master)
Author: yourname <yourname@yourmail.com>
Date:   Wed Jul 18 16:43:27 2012 +0900

    first commit

7 git分支流与项目开发

7.1 简单版本

  1. 本地 dev 分支提交到远端开发分支
  2. 本地 main 分支同步远端 main 分支,即拉取下来
  3. 本地 dev 分支下 rebase main(不能反过来,会导致主分支被 rebase ,产生混乱),并解决 rebase conflict
  4. 本地 dev 分支 pr 到远端 main 分支

B站码农高天:pull rebase解决main版本领先问题,然后每一次commit之后,分支是否应该删除呢?可以删除,但不建议。

一个热评:合并前不要去git merge并且提交前使用rebase -i 去压缩提交次数。
Pasted image 20240124115427.png

7.2 复杂版本

1.png

8 ssh连接

cd ~/.ssh
ls 观察有无id_rsa.pub

ssh-keygen -t rsa -C "leibzc@163.com"
ssh -T git@github.com

Hi xiaobai-171! You've successfully authenticated, but GitHub does not provide shell access.

github中复制即可.

如果连接不上github,可以这样显示指明ssh连接地址,Ubuntu 22.04 UI#26.7 ssh连接github不上
Pasted image 20240104165104.png|500


9 Trick

10 命令备忘

  1. git config
    • 设置用户名和邮箱地址,用于Git提交时记录。
    • 例子:$ git config --global user.name "John Doe" 和 $ git config --global user.email johndoe@example.com
  2. .gitignore
    • 设置文件的忽略规则,让一些文件不会被记入仓库的更改中。
  3. .gitattributes
    • 设置文件的属性。
  4. git init
    • 把当前目录变成Git仓库。
    • 例子:$ git init
  5. git clone
    • 克隆远程仓库到本地。
    • 例子:$ git clone https://github.com/libgit2/libgit2
  6. git status
    • 查看当前仓库的状态(有哪些文件修改了,有哪些文件暂存了等)。
    • 例子:$ git status
  7. git add
    • 将修改的文件提交到暂存区。
    • 例子:$ git add file.cpp 或 $ git add .
  8. git commit
    • 提交更新,将暂存区的文件快照永久性存储到Git目录。
    • 执行命令后会弹出文本编辑器,用于编辑提交说明。
    • 例子:提交更新命令,后面通常会跟随提交说明。
  9. git checkout
    • 还原文件到上一个提交时的状态。
    • 例子:$ git checkout file.cpp
  10. git rm
    • 从Git仓库中删除文件。
    • 注意:这也会在磁盘中删除文件,除非使用--cached选项。

11 学习资源

git工作流 | 码农高天
[猴子都能懂的git入门]
Simple Git tutorial for beginners | Nulab