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(-)
当同一行被多个分支修改时,会出现合并冲突
要处理git中的合并冲突,有以下几个步骤:
- 使用
git status
命令查看哪些文件有冲突 - 使用
git diff
命令查看具体的冲突内容 - 打开冲突文件,找到由<<<<<<< ======= >>>>>>>标记的部分
- 根据需要编辑冲突文件,保留或删除不同分支的修改,或者合并它们
- 删除<<<<<<< ======= >>>>>>>标记,保存并关闭文件
- 使用
git add
命令将解决了冲突的文件添加 到暂存区 - 使用
git commit
命令提交合并结果
2.2 快进合并
不保留分支记录,直接快进,仿佛这一条分支没有发生过。
2.3 分支切换
git checkout branch_name
分支切换
2.4 分支变基
git rebase
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 中^的使用方法
^是在指定父节点,~才是回退
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 简单版本
- 本地 dev 分支提交到远端开发分支
- 本地 main 分支同步远端 main 分支,即拉取下来
- 本地 dev 分支下 rebase main(不能反过来,会导致主分支被 rebase ,产生混乱),并解决 rebase conflict
- 本地 dev 分支 pr 到远端 main 分支
B站码农高天:pull rebase解决main版本领先问题,然后每一次commit之后,分支是否应该删除呢?可以删除,但不建议。
一个热评:合并前不要去git merge
并且提交前使用rebase -i
去压缩提交次数。
7.2 复杂版本
- 结合 pull request的方式去做Code Review。
- 如下图所示,我们的程序刚创建时只有默认的master分支,也就是节点A,这时我们需要进行功能版本的开发,于是从A节点签出一个Develop分支,这时就有了节点B,于是产品需要开发新功能时,从B,C的时间节点签出了D,E进行功能开发,功能开发完成后相继有了节点F,G,然后将完成的新功能合并到Develop分支上,有了节点H,然后需要发布,签出到Release分支,有了节点I,然后进行测试,测试中发现Bug,由程序员修复,进而有了J,K节点,然后测试完成,将预发布合到Develop和Master分支上,得到了节点L,M,M节点需要打上相应的tag,标记是一个发布版本,然后项目上线,上线后出现紧急Bug,需要签出到HotFix分支,进行修复,修复后将代码签入Develop和Master分支。其中Feature、Release、HotFix完成合并到Develop和Master后需删除对应的分支。
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不上
9 Trick
- 网速较慢时,--depth=1 能够使得只克隆最近一次的提交
- 网速较慢时,ssh连接一般有帮助
10 命令备忘
git config
- 设置用户名和邮箱地址,用于Git提交时记录。
- 例子:
$ git config --global user.name "John Doe"
和$ git config --global user.email johndoe@example.com
.gitignore
- 设置文件的忽略规则,让一些文件不会被记入仓库的更改中。
.gitattributes
- 设置文件的属性。
git init
- 把当前目录变成Git仓库。
- 例子:
$ git init
git clone
- 克隆远程仓库到本地。
- 例子:
$ git clone https://github.com/libgit2/libgit2
git status
- 查看当前仓库的状态(有哪些文件修改了,有哪些文件暂存了等)。
- 例子:
$ git status
git add
- 将修改的文件提交到暂存区。
- 例子:
$ git add file.cpp
或$ git add .
git commit
- 提交更新,将暂存区的文件快照永久性存储到Git目录。
- 执行命令后会弹出文本编辑器,用于编辑提交说明。
- 例子:提交更新命令,后面通常会跟随提交说明。
git checkout
- 还原文件到上一个提交时的状态。
- 例子:
$ git checkout file.cpp
git rm
- 从Git仓库中删除文件。
- 注意:这也会在磁盘中删除文件,除非使用
--cached
选项。
11 学习资源
git工作流 | 码农高天
[猴子都能懂的git入门]
Simple Git tutorial for beginners | Nulab