重装电脑时忘了备份Typora在C
配置
系统配置
git config --system -l
用户配置
必须先创建用户名和密码后才会生成用户配置文件
git config --global -l
目前只能登记一个user信息,后续再执行登记用户名和邮箱的指令,是执行修改操作。
环境变量
配置环境变量只是为了能全局使用,即在电脑的任何位置使用git。
但右键->Git Bash Here已经能实现这功能了,所以配不配置无所谓。
Git基本理论
Workspace:工作区,平时放代码的文件夹。
Index/Stage:暂存区,临时存放改动。实际上也只是一个文件,保存即将提交到文件列表信息。
Repository:本地仓库。安全存放数据的位置,其中存有提交到所有版本的数据。
Remote:远程仓库,托管代码的服务器。GitHub或gitee这样的平台。
基本命令
工作目录(WorkSpace)一般就是你希望Git帮助你管理的文件夹,可以是你项目的目录,也可以是一个空目录,建议不要有中文。
本地搭建
git init
会创建一个.git 文件夹
克隆远程仓库
从网站获取https或ssh链接
git clone [url]
文件的4种状态
文件的四种状态
版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上。
- Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过
git add 状态变为Staged . - Unmodify: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为
Modified . 如果使用git rm 移出版本库, 则成为Untracked 文件 - Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存staged状态, 使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改 !
- Staged: 暂存状态. 执行
git commit 则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify 状态. 执行git reset HEAD filename 取消暂存, 文件状态为Modified
如果目录中存在中文,会使得目录名看起来非常复杂。
文件提交
#查看指定文件状态
git status [filename]
#查看所有文件状态
git status
# git add . 添加所有文件到暂存区
# git commit -m "消息内容" 提交暂存区中的内容到本地仓库 -m 提交信息
如果在使用commit时没有加上"-m",就会进入vim编辑器。
必须先add ,才能commit
直接commit的提示:
error: pathspec 'hi.txt' did not match any file(s) known to git
使用git add hello.txt 后
将“hello.txt”改为“hello there.txt”,git不会追踪文件名修改,会将其视为文件“hello.txt”已被删除。
如果将文件名改回,或让任意一个文件命名为“hello.txt”,则git将其识别(下图)。
提交时忽略文件
建立.gitignore 文件
!补充从linux虚拟机提交到github
直接用http连接上传不了,用ssh先clone,再push,成功。但先要配置ssh密钥。
ssh配置
1、生成密钥
可以设置属性,具体内容需要时再查,直接3次回车就行。
ssh-keygen
2、将SSH key 添加到 ssh-agent
ssh-add ~/.ssh/id_rsa
如果出现“Could not open a connection to your authentication agent.” 的错误可以先输入以下指令,
eval "$(ssh-agent -s)"
然后再执行一次ssh-add
3、将SSH key 添加到GitHub账户
github中:“Settings”–>“SSH and GPG keys”–>“New SSH key”,
cat /root/.ssh/id_rsa.pub
将文件内容完全复制过去,注意一下格式。
4、验证key
ssh -T gitcpplinue@github.com
这一步失败了,但不影响使用远程库。
然后就能通过ssh 链接从远程库获取代码了
git clone git@github.com:gitcpplinue/socket_practice.git
Git常用指令
另开一版,记录可能会常用到的git指令。
更多指令参考官方文档:https://git-scm.com/docs 并自己实践。
git init
初始化
出现.git 文件夹就算成功了。
git config
git config --global user.name "……"
git config --global user.email "……"
git add
init 后的文件夹内的新文件用git status 查看会以红字显示
git add [文件名]
追踪该文件
git add .
追踪工作区(.git 文件夹所在位置)内所有文件
git commit
将索引区的文件提交到本地库。
git commit [文件名] -m "注释信息"
如果没有-m "注释信息" ,则会进入vim编辑器。总之,commit指令必须要有注释。
[文件名] 和 -m 可以互换
git commit -m "注释信息"
提交索引区内的所有文件。
git diff
git diff HEAD [文件名]
对比工作区文件与本地库文件。
HEAD为索引号,可用git log 查看。
git diff [文件名]
对比工作区文件和暂存区文件。
如果没有文件名,则对比所有文件。
对于文件的修改,git以行为单位,从上到下严格按顺序记录,一切修改都视为对行的增、删。
内容:“123” ——> “1234” 视为“减1行,增1行”
abc abc
内容:“123” ——> “abc” 视为“减2行,增2行”
abc 123
git log
查看提交历史
git log
git log --pretty=oneline
相对于默认log显示更精简。
git log oneline
在上一代码基础上,索引号只显示前7位。
git reflog
会显示历史提交步数:HEAD@{}
bc66901 (HEAD -> master) HEAD@{0}: commit (merge): merge
025e682 HEAD@{1}: commit: Edit content of file in MASTER
eccad07 HEAD@{2}: checkout: moving from branch0 to master
ef1645a (branch0) HEAD@{3}: commit: Only 1 left int BRANCH0
91aff97 HEAD@{4}: checkout: moving from master to branch0
eccad07 HEAD@{5}: commit: Only 1 left int MASTER
c908d4a HEAD@{6}: merge branch0: Merge made by the 'recursive' strategy.
按q可退出日志。
!!删除文件
还是 add、commit
实践:将一些文件移入一个新目录后,直接git add . 后commit ,只会本地库只会响应“新增”的操作,即对于工作区来说是文件剪切,而对于本地库来说是复制粘贴。push 后的远程库与本地库同理,仍保留本应删除的原文件。
在本地/远程库中实现剪切的解决方法:使用git status 查看细节,能看到提示,使用git rm 文件名 将工作区的删除操作映射到暂存区,然后commit 映射到本地库,最后push 即可。
git reset
git reset --hard 索引号
参数 --soft 仅切换本地库版本
--mix 切换暂存区、本地库
--hard 工作区、暂存区、本地库全部切换到该版本
git reset --hard HEAD~1
切换到上1个版本
git reset --hard HEAD
切换到当前版本。用途:在工作区、暂存区删除了文件但未commit,可用这方法找回文件。
索引号可通过git log 查看。当前所在的版本会用 (HEAD -> master) 的方式标记。
使用reset切换版本后,这一动作也会作为历史版本记录。经过多次切换,用git reflog 会看到很多索引号相同的版本记录。
git branch
git branch 分支名
创建一个新分支
git branch -v
查看已有分支
git checkout 分支名
切换分支
自己实践的一些总结
- 切换分支后,工作区文件也会被更改,但仅限于那些被追踪的文件。未被追踪的“无主文件”对所有分支可见。
- 不同分支共享暂存区!?add文件后,在2个分支内用
git status 检查,该文件都为绿色标记。在任一分支中commit后,该文件就属于该分支了。 - reset可以在分支间切换版本!即:可以直接将其他分支的历史版本拿来用。
- 使用
git log 只会查看本分支的历史提交信息;使用git reflog 会查看所有分支的历史提交信息。
git merge
git merge 分支名
同名文件内容不同时会有冲突。
冲突的内容会以
<<<<<<< HEAD
asdasd
=======
123123
>>>>>>> master
的形式呈现,且当前所在分支会成为 (branch0|MERGING) :在branch0分支内执行merge操作遇到冲突。
解决方法:
手动修改文件内容,然后再add、commit。
在冲突状态下,不能commit特定文件,只能直接git commit -m “……” 。
其实不做任何修改,直接add、commit也可以。但文件内容仍会保留冲突部分标记,对于实际工作来说是没意义的。
远程库相关操作
git remote
git remote -v
查看已有的远程库信息
git remote add 别名 https链接
git并不会去验证这个链接,瞎几把填都可以。
git push
将本地库内容提交到远程库
git push 别名/链接 本地库分支名
之后就会要求输入GitHub用户名、密码
git clone
从远程服务器克隆整个版本库到本地,似乎包括所有的历史版本、分支、日志。
git clone 链接
如果使用的是链接,且没有事先创建别名,则会自动取一个。
git fetch
git fetch origin master
将远程库master分支下载到本地
git checkout origin/master
切换到已下载到本地的远程库
之后可用
ll
查看文件内容,如果没问题,
git merge origin/master
git pull
只下载master版本
pull = fetch + merge
远程库的冲突解决
push,因为文件冲突,失败。则pull,修改冲突文件,再push
|