日常科研使用Git指南

版权声明:要转随便转,如果能加上原文的链接就感谢各位了。( ⊙ o ⊙ ) https://blog.csdn.net/Hungryof/article/details/88087985

总说

给我的感觉是: 早用早享受, 晚用多受罪.
比如, 我们改代码时候, 经常会有多个想法, 这些想法的改的代码会有冲突. 如果在以前, 都直接把代码复制两份到不同文件夹下, 分别进行更改.
还记得被 xxx_add1, xxx_remove2等等的恐惧吗? 其实这些都可以放在一个文件夹下, 而且相互改的代码不会影响. 这就需要 Git这个很神奇的东西.

附加

基本上windows上还是用WinEdit挺好用的。这里有一个破解版(10.2版本的), https://www.52pojie.cn/forum.php?mod=viewthread&tid=583476 完全靠谱!

下面讲的东西包括:

  1. 建立一个github仓库, 并初始化
  2. 文件更改的记录以及提交
  3. 建立多个分支(不同版本的代码通过分支控制)
  4. 分支的合并
  5. 合并产生冲突的解决方法

这里稍微说一下, repository是仓库的意思, 其实就是指一大堆项目文件, 里面所有的更改都会被记录, 那么这样的项目我们称之为 仓库.

新建一个github仓库

左上角的"+", 然后 “New repository”, 出现

在这里插入图片描述我们这里建立一个私人仓库(这个号是我的第二个小号,基本弃用了), 此时出现
在这里插入图片描述下面其实是三种建立仓库的情况, 分别针对普通的项目(还没用git追踪更改), 以及本地的仓库(已有git), 从其他仓库来导入.
现在按我的来,别看上面了~ ~
我们先建立一个文件夹

mkdir my_repo
cd my_repo

此时我们进入了一个空目录, 这时候, 直接初始化

git init

我们看看现在文件夹里面有啥

ll

我们发现多了一个隐藏文件夹 .git/ 没错, 这个文件夹主要负责仓库的更改的追踪
在这里插入图片描述
这时候我们往里面加点东西.

vim readme.md

里面写点东西, 比如 It is my repo, ready to make some surprise!
然后我们键入

git status

git status是查看仓库的状态, 我们看到
在这里插入图片描述这里出现, 这里说, 有未跟踪的文件, 需要用git add加上去.

git add readme.md

我们再来看看现在的状态, git status
在这里插入图片描述
这个说明, 我们让仓库可以追踪我们这个文件了, 并且由于之前readme不在git的追踪列表中(因为之前仓库的没文件啊,哈哈), 所以这时候出现 “更改”.
注意一下, 我们这里 git add 之后, 我们还有进行 提交

git commit -m "add readme"

注意有-m 这个参数.
在这里插入图片描述
git commit是把本地更改, 进行作为一个提交进行存储. 存储完之后, 我们再看git的状态, 已经是干净的工作区了.
接下来我们要把提交推送 到网上.
首先我们得确定origin, 就是默认推送到哪个网址

git remote add origin https://github.com/LambdaWill/my_repo.git

附加操作,其实添加源之后, 可以去看看.git下面是不是多了什么东西.

vim .git/config

在这里插入图片描述
我们发现了这些信息, emmm
然后, 我们就推送呗.

git push -u origin master

-u 只在第一次提交需要加, 以后的提交不需要加. -u其实是指定origin为默认主机.
origin maser表示, 我们将该 分支推送到origin的master分支. origin就是我们之前加的那个网址.
在这里插入图片描述
此时我们的网页
在这里插入图片描述

强大的分支

我们可以建立不同分支, 从而对仓库的代码更改互不影响.

vim cal_twoMat.py
 import torch
 
 a = torch.randn(3,4)
 b = torch.randn(4,3)
 
 c = torch.mm(a, b)
 
 print(c)

一套操作走起,

git status
git add cal_twoMat.py
git commit -m "add cal_twoMat"

我们先提交上去

git push origin master

这时候, 你想, 感觉只把c 打印出来, 有点儿莫名其妙, 于是, 你进行更改. 但是原始的只把c 打印出来的代码版本又想保留. 此时我们新建一个分支.

git checkout -b "print_more_info"

git checkout切换分支的意思, 但是如果后面的分支是新的, 那么就是新建分支了.
我们再看看现在的分支

git branch

在这里插入图片描述
我们发现, 我们不仅建立了一个分支, 还自动切换到这个分支上去了. 现在我们在这个分支进行更改

vim cal_twoMat.py
import torch
 
 a = torch.randn(3,4)
 b = torch.randn(4,3)
 
 c = torch.mm(a, b)
 
 print('a: ')
 print(a)
 print('b: ')
 print(b)
 print('a mm b, get:')
 print(c)

运行一下, emm

yan@yan:~/my_repo$ python cal_twoMat.py 
a: 
tensor([[-0.8150, -0.3566,  0.0078,  1.6060],
        [-0.5543,  0.5904,  0.3476, -0.3242],
        [-1.1820,  2.2387,  0.5425, -0.9740]])
b: 
tensor([[ 0.6056,  0.7839, -0.8740],
        [-1.4138, -2.0191,  0.0189],
        [ 0.5080, -0.1143, -0.7414],
        [ 0.6104,  0.3395,  0.7500]])
a mm b, get:
tensor([[ 0.9949,  0.6254,  1.9043],
        [-1.1917, -1.7763, -0.0052],
        [-4.2000, -5.8395, -0.0573]])

自我感觉良好, 提交一下

git status
git add cal_twoMat.py
git commit -m "print more info of matrix multiply"

然后我们推送到网上.

git push origin print_more_info

注意: 这里是推送到origin的 print_more_info分支, 一句话, 本地分支与源的分支是一致的. 如果是写成origin master会出错,
我们来看看网页的情况
在这里插入图片描述
这时候我们验证一下,是不是真的不会影响原来的代码啊(master分支)

git checkout master
vim cal_towMat.py

哇,神奇, 完全没变!

至此总结一下:

git status  检查分支状态
git branch  查看分支
git add some_file  将文件添加到仓库追踪里
git commit -m "some words"  将所有add的更改, 进行作为一次提交
git push origin some_branch  将提交 推送到源的某个分支
git checkout xxx   切换分支
git checkout -b xxx  新建一个分支

Git进阶

我们发现, print_more_info的修改得挺好的, master分支也应有这个更改. 这时候就是合并分支.** 我们这里是将 print_more_info 分支 merge到master分支上**.
直接网页弄就行…
在这里插入图片描述在这里插入图片描述这时候我们就可以看到这个pull request, 就是合并请求. 直接merge request, 出现
在这里插入图片描述
这时候检查网上的代码,已经是合并后的了.

这时候我们可以删除本地和远程的pritn_more_info分支,因为它的使命已经完成.

git branch -D "print_more_info"

这时候发现本地也只有一个分支了. 值得注意的是, 不能删除所在的分支. 这点没啥好说的.
远程分支可以通过网页版进行操作, 或者终端输入

git push origin --delete print_more_info

我们现在去看看一些仓库的情况呗. 我们找一个小的, 比如这个 https://github.com/pytorch/contrib/network
我们看到, 现在有3个合并请求, 并且看Network可以了解到, 有这些人fork了这个代码, 并且是往fork的代码进行了 推送的! 这些一个个点分别是 这些推送的时间, 并且都是有相关信息的. 也可以看到哪些人在哪个时间fork了代码, 并且哪些人往源仓库的推送被merge了~
在这里插入图片描述

到目前位置, 应该差不多了吧. 至于更多的操作, 等我有空再来写啊~ ~ 这是一个新的flag
之后要写: 如何解决冲突

猜你喜欢

转载自blog.csdn.net/Hungryof/article/details/88087985