赞
踩
说明 | 命令 |
---|---|
初始化仓库 | 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 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 mv -v (老文件名) (新文件名)
这里先直接放出常用的.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,处理起来会非常麻烦。
如果经过以上流程你已经学会了在本地仓库的commit
,那么下面就可以尝试将本地仓库的内容上传到远程仓库。
首先先添加远程仓库地址,这里使用token的方式。
git remote add <shortname> https://<token>@github.com/<用户名>/<仓库名>.git
Token 的获取:点击头像->选择setting
->选择Developer Settings
->选择Personal access tokens
->创建一个Tokens(classic)
。【记得及时复制保存token,下次刷新你会看不到这个token】
如果你已经有了叫origin
的url
地址,你可以使用set-url
来修改它,或者重新add
一个别的名字的url
git remote set-url origin https://<token>@github.com/<用户名>/<仓库名>.git
设置好远程仓库地址后你可以使用push
命令来上传本地分支
git push -u (远程仓库名) (分支名)
如果远程仓库存在本地仓库没有的修改,就会产生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
更新远程仓库即可
前面介绍了这么多 git
的命令行操作,平时博主用的最多的还是有着可视化界面的GitHub Desktop
。下面简要介绍它的使用方法。
在登陆绑定你的Github账号后就可以进入主界面了,如下图所示。
注意:当改变涉及多个文件时,你的 commit summary
就不会自动生成了,需要填写 commit summary
后才能 commit
。
在本地 commit
后,就需要 Push
操作以同步更新远程仓库的代码。
在左上角的仓库选项选择add——Clone Repository…
点击后就选择你需要克隆的远程仓库即可
其它操作也很简单,不赘述了。
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。