文章目录
引用
本地仓库基本使用
添加文件
git add file_name
同一个文件两次add,那么入库的时候,会入库最新一次add。
推入仓库
git commit -m "remark"
-m 参数是写版本备注。就像java语言注释一样,java注释告诉这段代码发生了什么。 -m以及后面的文字告诉这次版本更新发生了什么。
掌握仓库当前状态
git status
可以查看有哪些文件修改了还没有提交。
查看文件改变的内容
git diff file_name
查看版本日志
git log
git版本
git使用HEAD
表示当前版本,HEAD^
表示上一个版本,HEAD^^
表示上上个版本,如果版本太多,想表示上100次版本,使用HEAD~100
表示。
git reset --hard HEAD^
有两个版本,旧版本是A,新版本是B。
如果回退版本到A。那么使用git log就没有版本B的信息了。
那么如何前进到B版本呢,只要还知道B版本的*[commit id](# commit id)* 就可以通过git reset --hard commit id
一般commit id可以写前几个进行模糊查询呢,但是尽量多写,防止冲突。
寻找commid id
- 查看git bash控制台历史记录。
- 使用
git reflog
查看命令历史记录。
工作区文件回退
文件A之前已经入库了,目前正在修改,还没有add。但是想回到修改之前的状态,也就是最后一次入库的状态。使用git checkout -- file_name
可以回退到该文件最后一次入库的版本。
一定不要忘记 – 两个短横线,不然就成了另外一个命令
如果此时A已经add进暂存区了,怎么办?使用git reset HEAD file_name
将暂存区的文件撤销掉。
撤销掉之后git status告诉文件已经更改了,使用git checkout – file_name回退就当修改无事发生了。
如果已经入库了,那么只好使用git reset回退版本了,不过前提是没有被推到远程仓库。
删除文件
在文件管理器中删除或者使用rm file_name
删除,但是git知道删除了啥文件。git status会告示你删除了啥文件。
- 确定这个文件是无用文件,就是需要删除的。 使用
git rm file_name
将文件从仓库里删除(同时文件资源管理器里的也会被删除),这个时候git status依旧会告诉你什么文件被删除了,可以继续通过*git commit -m “remark”*来确定这次修改。 - 如果此时反悔了,git status也告诉你什么文件被删了,使用上面的git checkout – file_name来恢复文件就万事大吉了。
commit id
版本号
git每一次更新版本都会生成一个很长的16进制数,也就是commit id。也就是版本号,只不过git防止版本号冲突,所以没有采取版本1,版本2这种格式。
远程仓库
准备工作
-
首先注册一个github账号
-
在git Bash中输入
cd ~/.ssh
检查是否生成了key,没有的话就找不到这个文件。- 没有ssh文件的话,输入
ssh-keygen -t rsa -C "邮箱地址"
.建议邮箱地址和github注册的邮箱地址一样。 - 然后一直回车。
- 没有ssh文件的话,输入
-
进入.ssh文件,找到id_rsa.pub。
-
将id_rsa.pub所有的内容添加到github的SSH Key设置里面。
-
检查是否设置成功,在gitBash中输入
ssh -T git@github.com
,会要求你输入密码,没设置密码的话,等一下就是的了。第一次可能会弹出一个警告,让你输入yes或者no,输入yes就可以了。注意,不要在git中直接输入yes,会造成gitBash死循环。可能出现的警告 输入yes就可以了,这个警告只出现一次。我的理解为第一次通过ssh进行数据交互的信任警告。
The authenticity of host ‘github.com (xx.xx.xx.xx)’ can’t be established.
RSA key fingerprint is xx.xx.xx.xx.xx.
Are you sure you want to continue connecting (yes/no)?引自 廖雪峰git教程
-
如果没有弹出步骤5的警告,会出现一句话*Hi (your name)! You’ve successfully authenticated, but GitHub does not provide shell access.*说明成功了。
将本地仓库推给远程仓库
在你的github中创建一个新的仓库,如果仅仅用于学习远程仓库的话,只需要设置一个仓库名就是的了。
关联远程仓库使用git remote add origin(本地自定义的远程仓库名称) git@github.com:(github的用户名)/test(远程仓库的名称).git
将本地仓库推到远程仓库(github中)git push -u origin(本地自定义的远程仓库名称) master
由于远程库是空的,我们第一次推送
master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。引自 廖雪峰的git教程
之后如果想继续将本地代码推给远程仓库,只需要git push origin(本地自定义的远程仓库名称) master
查看远程仓库
git remote -v
删除远程仓库的连接
git remote rm origin(本地自定义的远程仓库名称)
如果需要删除github上面的物理仓库,需要前往github删除。
克隆远程仓库
git clone git@github.com:(your github name)/test_clone(your repository).git
分支
关于分支的介绍
建议去看看廖雪峰写的分支介绍。有图,说的比较容易理解。
创建分支
git checkout -b dev
其中**-b**参数表示创建并切换,相当于git branch dev
和git checkout dev
这两条命令的简化版。
*git checkout (分支名)*与git switch (分支名)
都可以切换分支
查看当前分支
git branch
这个命令会列出所有的分支,并且会在当前分支前面标注一个 * 号。
合并分支
git merge dev
将dev分支修改的内容和master分支进行合并。
合并模式有Fast forward快速合并,如果是这种模式下删除分支,会丢失被删除的分支所有信息。
如果不想已快速合并模式合并分支的话,在merge合并时添加上--no-ff
参数,表示禁用Fast forward模式。这会产生一个新的commit id所以最好写上*-m “remakr”*。
删除分支
git branch -d dev
因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在
master
分支上工作效果是一样的,但过程更安全。引自 廖雪峰的git教程
分支冲突
两个分支修改同一个文件,git没办法自动合并时,会提示冲突,需要手动更改。
Auto-merging t2.txt
CONFLICT (content): Merge conflict in t2.txt
Automatic merge failed; fix conflicts and then commit the result.
点开文件会出现<<<<<<<
,=======
,>>>>>>>
这样的提示,自己保留需要提交的分支内容再次入库就可以了。
git log --graph
可以查看分支合并图。
使用分支修复bug
创建新的临时分支前,可以使用git stash
存储当前的工作区(文件夹)。此时的git status就是干净的。
使用git stash list
查看stash区,是数组。
git stash pop
取出stash区内容,并删除stash区内容。
git stash apply
取出stash区内容,但是不会删除stash区内容,需要git stash drop
来删除stash区内容。
git stash apply stash@{0}
可以取出指定的stash区内容。
在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit>
命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
强制丢弃一个没有被合并的分支
git branch -D (分支名)
将删除分支的 -d参数换为了大写的 -D参数
错误
Q:>fatal: not a git repository (or any of the parent directories): .git
A:>当前目录没有.git目录,也就是没有执行git init
初始化,值得注意的是,在初始化之前检查一遍你当前的目录是否在你的理想目录。
Q:>git Bash控制台出现**(end)**,无法操作。
A:>按下键盘Q键恢复正常。
Q:>fatal: not a git repository (or any of the parent directories): .git
A:>当前目录没有.git目录,也就是没有执行git init
初始化,值得注意的是,在初始化之前检查一遍你当前的目录是否在你的理想目录。
Q:>git Bash控制台出现**(end)**,无法操作。
A:>按下键盘Q键恢复正常。