git 实战入门

git 实战入门

命令速查表

说明命令
初始化仓库git init
拷贝一份远程仓库,也就是下载一个项目。git clone
添加 特定文件/所有文件 到暂存区git add (file path) / git add .
删除暂存区内的特定文件/所有文件git rm -r --cached (文件路径/.)
提交暂存区内容添加到仓库中git commit
查看历史提交记录git log
回退版本git reset --(option) [HEAD]
创建分支git branch (branchname)
切换分支git checkout (branchname)
合并分支git merge (branchname)
比较文件的不同,即暂存区和工作区的差异git diff [–(option)] [file]
查看仓库当前的状态,显示有变更的文件git status [-s]
远程仓库操作git remote
从远程获取代码库git fetch
下载远程代码并合并git pull (远程主机名) (远程分支名)[:(本地分支名)]
上传远程代码并合并git push (远程主机名) (本地分支名)

请添加图片描述

文件管理命令

删除文件

git rm (filename)

删除文件夹

git rm -r (directoryname)

文件重命名

git mv -v (oldname) (newname)	# 参数-v表示显示详细信息,可以不要

文件移动

git mv -v (oldpath) (newpath)	# 参数-v表示显示详细信息,可以不要

创建文件夹操作可以直接在文件系统中进行,git会视为新增文件

安装git

安装教程

安装好后先配置你的个人信息。

git config --global user.name  "你的用户名"  
git config --global user.email  "你的邮箱"

配置好后使用

git config --list查看你的信息

在本地尝试一次版本控制

这部分内容参考【菜鸟教程B 站康文昌:git、github 保姆级教程入门

创建一个文件夹,在里面新建一个初始版本的文件

然后在终端git init,新建一个git仓库【上述流程见下图】

在这里插入图片描述

使用git add (文件名)添加需要保存的文件,再使用git commit提交该版本。

git add . 为提交当前目录下的所有文件。commit后会让你填写提交备注,使用vim编辑的。

如果不想写过多的备注,可以直接用 git commit -m "第一次提交",效果是一样的。

insertion(+)表示做了一次新增操作,git只有新增与删除操作。

使用git log可以输出你的提交日志信息,你的所有提交记录都会显示。

这里演示了一次将test.txt 中的 v0.1改为 v0.2后提交的过程

可以看到出现insertion(+)insertion(-)记录

回退到某一版本

通过 git log 找到 commit id

通过 git reset --hard (commit id) 回退到你期望的版本。(这里–hard 还有soft、 mixed的选项,具体查菜鸟教程即可)

图中回退到了第二次的提交状态,可以发现git log 清除了第三次的提交。

分支管理

**但有时候我们仅仅想回溯到第二次提交的状态,不想删除第三次提交的内容。**这里就需要引入branch功能

使用git branch (分支名)创建分支,在这个分支中提交你的文件。可通过checkout 切换分支

有分支就有合并,假如branch 0.3上是修改main分支上v0.3的文本。我们接下来进行如下操作

# 切换到主分支
git checkout main
# 将分支0.3合并到 main 分支上
git merge 0.3

可以看到,因为main分支的v0.2文本被修改为v0.3才成为分支0.3,因此main分支合并后的结果是文本变为v0.3

注意,由于分支0.3被合并了,因此main分支与0.3分支现在是一样的内容,理应删除0.3分支

使用git branch -d 0.3命令删除0.3分支。【删除分支时,不能切换到要删除的分支,要不然删不掉】

合并冲突解决

假设有以下场景

  • main分支的文本内容为:v0.2

  • 此时创建分支0.2,它的文本内容也为:v0.2

  • main分支修改文本内容为:v0.3

  • 分支0.2修改文本内容为:v0.4

  • 分支0.2添加文本内容为:v0.4 \n\r v0.5

此时,main分支尝试合并分支0.2就会出现合并冲突。

因为git不知道是要保存main分支的修改还是0.2分支的修改,或者保留两者的修改。

此时打开test.txt文件时会出现下图中的冲突内容,你需要优先解决冲突才能继续进行git操作

最原始的方法就是直接修改txt文件为你期望的结果,这里我就保留了所有修改结果。

此时文件里的内容为

v0.3
v0.4
v0.5

手动解决完冲突后,使用git add test.txt命令告诉Git冲突已经解决

再输入git commit提交合并。到这里就解决完了一次合并冲突。

git使用细节

文件重命名

如果你直接在文件系统中重命名文件加,git会认为改名之前的那个文件被你删了,然后就会产生各种冲突。

在git中对文件重命名使用git mv -v (老文件名) (新文件名)

.gitignore忽略特定的文件

这里先直接放出常用的.gitignore 内容

__pycache__
.idea
.DS_Store
.pytest_cache
node_modules

MacOS中,每个文件夹下都会存在名为.DS_Store的系统文件,它不应该被跟踪,因此需要忽略它。

.git的同级目录下创建.gitignore文件,写上.DS_Store即可,其它忽略规则如下:

# dir 根目录下不需要提交的目录,注意这么写只会忽略根目录下的__pycache__文件
/__pycache__
# file 不需要提交的文件
.DS_Store
# log 不需要提交的任意包含后缀名为log的文件
*.log

.gitignore忽略规则的优先级

在 .gitingore 文件中,每一行指定一个忽略规则,Git检查忽略规则的时候有多个来源,它的优先级如下(由高到低):
1、从命令行中读取可用的忽略规则
2、当前目录定义的规则
3、父级目录定义的规则,依次递推
4、$GIT_DIR/info/exclude 文件中定义的规则
5、core.excludesfile中定义的全局规则

.gitignore忽略规则的匹配语法

在 .gitignore 文件中,每一行的忽略规则的语法如下:
1、空格不匹配任意文件,可作为分隔符,可用反斜杠转义
2、以“#”开头的行都会被 Git 忽略。即#开头的文件标识注释,可以使用反斜杠进行转义。
3、可以使用标准的glob模式匹配。所谓的glob模式是指shell所使用的简化了的正则表达式。
4、以斜杠"/"开头表示目录;"/"结束的模式只匹配文件夹以及在该文件夹路径下的内容,但是不匹配该文件;"/"开始的模式匹配项目跟目录;如果一个模式不包含斜杠,则它匹配相对于当前 .gitignore 文件路径的内容,如果该模式不在 .gitignore 文件中,则相对于项目根目录。
5、以星号"*"通配多个字符,即匹配多个任意字符;使用两个星号"**" 表示匹配任意中间目录,比如a/**/z可以匹配 a/z, a/b/z 或 a/b/c/z等。
6、以问号"?"通配单个字符,即匹配一个任意字符;
7、以方括号"[]"包含单个字符的匹配列表,即匹配任何一个列在方括号中的字符。比如[abc]表示要么匹配一个a,要么匹配一个b,要么匹配一个c;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配。比如[0-9]表示匹配所有0到9的数字,[a-z]表示匹配任意的小写字母)。
8、以叹号"!"表示不忽略(跟踪)匹配到的文件或目录,即要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。需要特别注意的是:如果文件的父目录已经被前面的规则排除掉了,那么对这个文件用"!"规则是不起作用的。也就是说"!"开头的模式表示否定,该文件将会再次被包含,如果排除了该文件的父级目录,则使用"!"也不会再次被包含。可以使用反斜杠进行转义。

需要谨记:git对于.ignore配置文件是按行从上到下进行规则匹配的,意味着如果前面的规则匹配的范围更大,则后面的规则将不会生效;

十分重要:如果你不慎在创建.gitignore文件之前就push了项目,那么即使你在.gitignore文件中写入新的过滤规则,这些规则也不会起作用,Git仍然会对所有文件进行版本管理。简单来说出现这种问题的原因就是Git已经开始管理这些文件了,所以你无法再通过过滤规则过滤它们。所以大家一定要养成在项目开始就创建.gitignore文件的习惯,否则一单push,处理起来会非常麻烦。

进行GitHub远程操作

如果经过以上流程你已经学会了在本地仓库的commit,那么下面就可以尝试将本地仓库的内容上传到远程仓库。

首先先添加远程仓库地址,这里使用token的方式。

git remote add <shortname> https://<token>@github.com/<用户名>/<仓库名>.git

Token 的获取:点击头像->选择setting->选择Developer Settings->选择Personal access tokens->创建一个Tokens(classic)。【记得及时复制保存token,下次刷新你会看不到这个token】

如果你已经有了叫originurl地址,你可以使用set-url来修改它,或者重新add一个别的名字的url

git remote set-url origin https://<token>@github.com/<用户名>/<仓库名>.git

设置好远程仓库地址后你可以使用push命令来上传本地分支

git push -u (远程仓库名) (分支名)

push冲突解决

如果远程仓库存在本地仓库没有的修改,就会产生push冲突,跟合并冲突是一样的。

常见的解决方法就是pull远程仓库的文件来进行一次同步。但有时我们只想保留本地仓库的内容。

这时就需要用到git push -u origin +main命令来覆盖远程仓库,如上图所示。

下面我们就来说说合并冲突分支的方法【指的是远程仓库里的修改当作新增内容来pull】

使用命令git pull origin main来将origin远程仓库的main分支与当前分支合并。

如果出现fatal: refusing to merge unrelated histories报错,是因为两个分支是两个不同的版本,具有不同的提交历史。

在pull命令后加条件即可git pull origin master --allow-unrelated-histories,此时就合并分支了。重新push更新远程仓库即可

在GitHub Desktop中进行操作

前面介绍了这么多 git 的命令行操作,平时博主用的最多的还是有着可视化界面的GitHub Desktop。下面简要介绍它的使用方法。

在登陆绑定你的Github账号后就可以进入主界面了,如下图所示。

注意:当改变涉及多个文件时,你的 commit summary 就不会自动生成了,需要填写 commit summary 后才能 commit

在本地 commit 后,就需要 Push 操作以同步更新远程仓库的代码。

克隆远程仓库代码到本地

在左上角的仓库选项选择add——Clone Repository…

点击后就选择你需要克隆的远程仓库即可

其它操作也很简单,不赘述了。

在Pycharm中进行操作

pycharm中的操作也十分简单,菜单栏有GUI,操作效果对应。

问题:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从提示中看到是不同操作系统中的文本编辑的时候的换行符不一样导致的。所以搜索了一下git config 的core.autocrlf的说明:

格式化与多余的空白字符

格式化与多余的空白字符是许多开发人员在协作时,特别是在跨平台情况下,不时会遇到的令人头疼的琐碎的问题。 由于编辑器的不同或者文件行尾的换行符在 Windows 下被替换了,一些细微的空格变化会不经意地混入提交的补丁或其它协作成果中。 不用怕,Git 提供了一些配置项来帮助你解决这些问题。

core.autocrlf

如果协作开发使用不同的操作系统,你可能会遇到 CRLF 问题。 这是因为 Windows 使用回车(CR)和换行(LF)两个字符来结束一行,而 macOS 和 Linux 只使用换行(LF)一个字符。 虽然这是小问题,但它会极大地扰乱跨平台协作。许多 Windows 上的编辑器会悄悄把行尾的换行字符转换成回车和换行, 或在用户按下 Enter 键时,插入回车和换行两个字符。

Git 可以在你提交时自动地把回车和换行转换成换行,而在检出代码时把换行转换成回车和换行。 你可以用 core.autocrlf 来打开此项功能。 如果是在 Windows 系统上,把它设置成 true,这样在检出代码时,换行会被转换成回车和换行:

$ git config --global core.autocrlf true

如果使用以换行作为行结束符的 Linux 或 macOS,你不需要 Git 在检出文件时进行自动的转换; 然而当一个以回车加换行作为行结束符的文件不小心被引入时,你肯定想让 Git 修正。 你可以把 core.autocrlf设置成 input 来告诉 Git 在提交时把回车和换行转换成换行,检出时不转换:

$ git config --global core.autocrlf input

这样在 Windows 上的检出文件中会保留回车和换行,而在 macOS 和 Linux 上,以及版本库中会保留换行。

如果你是 Windows 程序员,且正在开发仅运行在 Windows 上的项目,可以设置 false 取消此功能,把回车保留在版本库中:

$ git config --global core.autocrlf false

参考:https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration

  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值