首页 > 其他分享 >Git 学习笔记

Git 学习笔记

时间:2023-07-20 23:56:16浏览次数:26  
标签:文件 git -- 笔记 学习 Git master 分支

Git 学习笔记

起步

安装

# 在 ubuntu 上安装
sudo apt install git-all

初次运行 Git 前的配置

安装完 git 之后,要做的第一件事就是设置你的用户名和邮件地址,因为每一个 git 提交都会使用这些信息,它们会写入到你的每一次提交中,不可更改:

git config --global user.name "lockegogo"
git config --global user.email [email protected]

如果使用了 --global 选项,那么该命令只需要运行一次,因为之后无论你在该系统上做任何事情, Git 都会使用那些信息。

Git 基础

获取 git 仓库

在已存在目录中初始化仓库

# 进入该项目录
cd /home/user/my_project
git init

上述命令将创建一个名为 .git 的子目录,这个子目录含有你初始化的 git 仓库中所有的必须文件,但是目前我们仅仅是做了一个初始化的操作,项目里的文件还没有被跟踪。

如果在一个已存在文件的文件夹(而非空文件夹)中进行版本控制,你应该开始追踪这些文件并进行初始提交。可以通过 git add 命令来指定所需的文件来进行追踪,然后执行 git commit

git add *.c
git add LICENSE
git commit -m 'initial project version

克隆现有的仓库

# 远程拉取
git clone <url> 
# 自定义本地仓库的名字
git clone <url> <新目录名>
# 举个栗子
git clone https://github.com/libgit2/libgit2 mylibgit

记录每次更新到仓库

# 检查当前文件状态
git status

# 跟踪新文件,将文件放入暂存区
git add README
# 注意:如果运行了 git add 之后又对文件做了修订,需要重新运行 git add 把最新版本暂存起来

# 忽略文件
$ cat .gitignore
*.[oa]
*~
# 第一行告诉 Git 忽略所有以 .o 或 .a 结尾的文件。一般这类对象文件和存档文件都是编译过程中出现的。 第二行告诉 Git 忽略所有名字以波浪符(~)结尾的文件

我们再看一个 .gitignore 文件的例子:

# 忽略所有的 .a 文件
*.a
# 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件
!lib.a
# 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO
/TODO
# 忽略任何目录下名为 build 的文件夹
build/
# 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
doc/*.txt
# 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
doc/**/*.pdf

如果要查看尚未暂存的文件更新了哪些部分,可使用 git diff,但注意其本身只显示尚未暂存的改动,而不是自上次提交以来所作的所有改动。

# 比较工作目录中当前文件和暂存区域快照之间的差异
git diff
# 比对已暂存文件与最后一次提交的文件差异
git diff --staged
git diff --cached

接下来提交更新:

git commit
# 接下来输入提交说明

# -m: 或者将提交信息与命令放在同一行
git commit -m "新增 README"

# -a: 跳过暂存,直接将所有已经跟踪过的文件提交
git commit -a -m "新增 README"

一些小 tips:

# 对文件重命名
git mv file_from file_to

查看提交历史

git log

# 查看每次提交的简略统计信息
git log --stat

Git 分支

# 创建分支
git branch testing
# 分支切换
git checkout testing

# 也可以使用一行命令同时执行创建和切换
git checkout -b testing

# 查看左右分支
git branch
--merged:过滤已经合并到当前分支的分支
--no-merged: 过滤尚未合并到当前分支的分支

接下来,我们模拟一个真实的场景:你将经历如下步骤:

  1. 开发某个网站。
  2. 为实现某个新的用户需求,创建一个分支。
  3. 在这个分支上开展工作。

正在此时,你突然接到一个电话说有个很严重的问题需要紧急修补。 你将按照如下方式来处理:

  1. 切换到你的线上分支(production branch)。
  2. 为这个紧急任务新建一个分支,并在其中修复它。
  3. 在测试通过之后,切换回线上分支,然后合并这个修补分支,最后将改动推送到线上分支。
  4. 切换回你最初工作的分支上,继续工作。
git checkout -b iss53
vim index.html
git commit -a -m 'added a new footer [issue 53]'

git checkout master

git checkout -b hotfix
vim index.html
git commit -a -m 'fixed the broken email address'
# 运行测试,确保修改是正确的,然后将 hotfix 分支合并回你的 master 分支来部署到线上

git checkout master
git merge hotfix

# 解决紧急问题之后,应该先删除 hotfix 分支,然后再回到之前的工作
git branch -d hotfix

git checkout iss53
vim index.html
git commit -a -m 'finished the new footer [issue 53]'

# 最终进行合并
git checkout master
git merge iss53
git branch -d iss53

# 注意如果一个分支还没有合并,使用 -d 是删除不掉的,如果真的不想要了,可以使用 -D 强制删除

如果在两个不同的分支中,对用一个文件的同一个部分进行了不同的修改,在合并时就会遇到冲突,Git 没办法干净的合并它们。

git status
# 使用图形化工具来解决冲突
git mergetool

服务器上的 Git

在服务器上搭建 Git

如何给团队的每个人提供服务器上的 git 的访问权?

我们可以给每个人创建账号并且设置临时密码,但这种方案十分麻烦。

更好的做法是:在主机上建立一个 git 账户,让每个需要写权限的人发送一个 SSH 公钥,然后将其加入 git 账户的 ~/.ssh/authorized_keys 文件。

生成 SSH 公钥

ssh-keygen -o

首先 ssh-keygen 会确认密钥的存储位置(默认是 .ssh/id_rsa),然后它会要求你输入两次密钥口令。 如果你不想在使用密钥时输入口令,将其留空即可。 然而,如果你使用了密码,那么请确保添加了 -o 选项,它会以比默认格式更能抗暴力破解的格式保存私钥。

现在,进行了上述操作的用户需要将各自的公钥发送给任意一个 Git 服务器管理员 (假设服务器正在使用基于公钥的 SSH 验证设置)。 他们所要做的就是复制各自的 .pub 文件内容,并将其通过邮件发送。 公钥看起来是这样的:

$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAklOUpkDHrfHY17SbrmTIpNLTGK9Tjom/BWDSUGPl+nafzlHDTYW7hdI4yZ5ew18JH4JW9jbhUFrviQzM7xlELEVf4h9lFX5QVkbPppSwg0cda3Pbv7kOdJ/MTyBlWXFCR+HAo3FXRitBqxiX1nKhXpHAZsMciLq8V6RjsNAQwdsdMFvSlVK/7XAt3FaoJoAsncM1Q9x5+3V0Ww68/eIFmb1zuUFljQJKprrX88XypNDvjYNby6vw/Pb0rwert/EnmZ+AW4OZPnTPI89ZPmVMLuayrD2cE86Z/il8b+gw3r3+1nKatmIkjn2so1d01QraTlMqVSsbxNrRFi9wrf+M7Q== [email protected]

配置服务器

搭建好之后,开发者可以克隆仓库并进行改动:

$ git clone git@gitserver:/srv/git/project.git
$ cd project
$ vim README
$ git commit -am 'fix for the README file'
# 将本地的 master 分支推送到 origin 主机的 master 分支
$ git push origin master

git push 命令用于从将本地的分支版本上传到远程并合并。

git push <远程主机名> <本地分支名>:<远程分支名>
# 如果本地分支名与远程分支名相同,则可以省略冒号:
git push <远程主机名> <本地分支名>

GitHub

对 Github 项目做出贡献

如何对 Github 项目做出贡献?下面举个栗子:

# 克隆项目
git clone https://github.com/tonychacon/blink

# 创建出名称有意义的分支
cd blink
git checkout -b slow-blink

# 修改代码
sed -i '' 's/1000/3000/' blink.ino (macOS)

# 检查改动
git diff --word-diff

# 将改动提交到分支中
git commit -a -m 'three seconds is better'

# 将新分支推送到 GitHub 的副本中
git push origin slow-blink

现在到 GitHub 上查看之前的项目副本,可以看到 GitHub 提示我们有新的分支, 并且显示了一个大大的绿色按钮让我们可以检查我们的改动,并给源项目创建拉取请求。

让你的 Github 仓库保持更新

当你派生了一个 GitHub 仓库之后,你的仓库(即你的“派生”)会独立于原仓库而独立。 特别地,当原仓库有新的提交时,GitHub 会通知你,但你的 GitHub 仓库不会被 GitHub 自动更新,这件事必须由你自己来做:

# 切换到 master
git checkout master 
# 抓取更改
git pull https://github.com/progit/progit2.git 
# 将 master 分支推送到 origin
git push origin master 

这虽然可行,但每次都要输入从哪个 URL 抓取有点麻烦。你可以稍微设置一下来自动完成它:

# 添加源仓库并取一个名字,这里叫它 progit
git remote add progit https://github.com/progit/progit2.git 
# 将 master 分支设置为从 progit 远端抓取
git branch --set-upstream-to=progit/master master 
# 将默认推送仓库设置为 origin
git config --local remote.pushDefault origin 

搞定之后,工作流程为更加简单:

git checkout master 
git pull 
git push 

参考资料

  1. Scott Chacon, Ben Straub:《Pro Git》

标签:文件,git,--,笔记,学习,Git,master,分支
From: https://www.cnblogs.com/lockegogo/p/17570035.html

相关文章

  • 人大金仓学习之三-表空间与跨磁盘存储和分区表
    人大金仓学习之三-表空间与跨磁盘存储和分区表背景最近在用人大金仓的数据库.前期学习了kwr和ksh等工具.今天想验证一下性能相关的情况.因为机器正好有多个磁盘的分区.想着能够将所有的硬盘都用上.提高性能,感觉总体还不错,所以想总结一下.注意这里只考虑OLTP比较......
  • 前端学习-html-1
    html常用标签h1-h6:标题p:段落strong/em:对文本进行设置  strong--加粗,强调作用 比如:商品价格  em--斜体,对文本内容修饰成斜体hr/br:hr---分割线  br---换行ul/ol/dl:表格使用li:表格使用div/span;网站布局划分时使用table:表格使用a:超链接img:图片......
  • 西瓜与机器 | 《机器学习》 周志华
    第一章奥卡姆剃刀:如果有多个符合的假设,选择最简单的一个。监督学习与无监督学习:训练数据是否有标注第二章评估方法留出法(hold-out)把数据集\(D\)划分为两个互斥的集合\(S,T\),一个用来训练,一个用来测试。\(S,T\)的划分需要注意保持数据分布的一致性。......
  • 学习日志
    7.20今天主要是复习了以前的知识点,顺便做了一道递归入门题斐波那契数列#include<bits/stdc++.h>usingnamespacestd;intfbnq(intm){ if(m==1||m==2){ return1; }else{ if(m<1)return0; elsereturnfbnq(m-1)+fbnq(m-2); }}intn;intmain(){ cin>>n;......
  • 硬件笔记之黑苹果Ventura使用Drop DMR table配合disableIOMapperMapping quirks解决无
    0x00概述关键词:VT-d, appleVTD, 黑苹果,英特尔wifi蓝牙无法打开,AX210,WIFI6E,disableIOMapper,disableIOMapperMapping/*板U配置=>技嘉z590Master+10900kOS=>Ventura13.x引导=>OpenCore0.9.2蓝牙WIFI=>板载Intel®Wi-Fi6EAX210支持wifi6和蓝牙5.......
  • c语言学习8
    指针复习:什么是指针:数据类型定义指针变量整型内存编号访问对应内存为什么使用指针:1、函数之间共享变量输入、输出2、提高传参效率指针变量4\8字节3、使用堆内存时如何使用指针:定义:类型*变量名_p;变量名以p结尾与普通变量以示区分一个只能定义一个指针变量初始化......
  • 遗传算法 深度学习
    遗传算法与深度学习1.遗传算法和深度学习的概述遗传算法和深度学习是两种不同的优化算法,它们在解决问题时有着不同的应用场景和方法。遗传算法是一种通过模拟生物进化过程中的自然选择和遗传机制来寻找最优解的优化算法。而深度学习则是一种通过神经网络模型来学习和识别复杂的......
  • c语言学习详解
    C语言一.C语言概述C语言是一种用于和计算机交流的高级语言,它既具有高级语言的特点,又具有汇编语言的特点非常接近自然语言程序的执行效率非常高C语言是所有编程语言中的经典,很多高级语言都是从C语言中衍生出来的,例如:C++、C#、Object-C、Java、Go等等C语言是所有编程语言......
  • 在GitHub上管理项目
      新建repository本地目录下,在命令行里新建一个代码仓库(repository)里面只有一个README.md命令如下:touchREADME.mdgitinit初始化repositorygitaddREADME.md将README.md加入到缓存区(可以用gitadd--a将所有改动提交到缓存(注意是两个杠)) gitcommi......
  • 快速幂·学习笔记
    快速幂是一个在O(log2n)的时间内计算ab的技巧,相比直接暴力计算O(n)的时间复杂度快了许多。原理在计算ab的时候,将b转换为kn*2n+kn-1*2n-1+……+k2*22+k1*21+k0*20(kn,kn-1,……k2,k1,k0取0或1),运用a(m+n)=am·an所以ab=a(kn*2n+kn-1*2n-1+……+k2*22+k1*21+k0*20)=kna2^n+kn-1a2^n-1+…......