创建版本库
通过git init命令把这个目录变成Git可以管理的仓库
注:1.右击当前文件夹选择git bash here 2.如果没看到.git目录,是因为这个目录默认是隐藏的,用ls -ah命令就可以看见或者文件夹'查看>隐藏的项目
把文件添加到版本库
第一步
用命令git add告诉Git,把文件添加到暂存区
git add file
file是文件名称 也可以用 . 代表添加所有文件 执行上面的命令没有任何显示是正常的
第二步
用命令git commit告诉Git,把文件提交到仓库
git commit -m "wrote a readme file"
-m后面输入的是本次提交的说明,必须写
版本库的一些操作
修改文件,然后把修改提交到Git版本库
git status
git status命令可以让我们时刻掌握仓库当前的状态,上面的命令输出告诉我们,被修改过了,但还没有准备提交的修改。
git diff
如果git status告诉你有文件被修改过,用git diff可以查看修改内容。
作了修改后,提交修改和提交新文件是一样的两步
第一步是git add file
第二步git commit -m "wrote a readme file"
我们再运行git status看看当前仓库的状态
Git告诉我们当前没有需要提交的修改,而且,工作目录是干净(working tree clean)的
版本回退
git log命令显示从最近到最远的提交日志 嫌输出信息太多,可以试试加上git log --pretty=oneline参数 看到的一大串类似1094adb...的是commit id(版本号) 在Git中,用HEAD表示当前版本
git reset --hard HEAD^
1.git reset --hard 回到当前版本,意思是回到最后一次commit的版本
1.上一个版本就是HEAD^上上一个版本就是HEAD^^,100个^比较容易数不过来,所以写成HEAD~100
2.HEAD^可以换成版本号大概前七位便可以了
3.如果后悔了想继续回退到上一个版本,只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个append GPL的commit id是1094adb...,于是就可以指定回到未来的某个版本
4.关掉了电脑找不到新版本的commit id,Git提供了一个命令git reflog用来记录你的每一次命令
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区
管理修改
Git是如何跟踪修改的,每次修改,如果不用git add到暂存区,那就不会加入到commit中
撤销修改
git checkout -- 'file'
意思就是把file文件在工作区的修改全部撤销
有两种情况
1.一种是file自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态
2.一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态
总之就是让这个文件回到最近一次git commit或git add时的状态。
小结
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD ,就回到了场景1,第二步按场景1操作
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库
删除文件
一般情况下,直接在文件管理器中把没用的文件删了,或者用rm命令删了 rm file
小结
命令rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
恢复误删的文件
git checkout -- file
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
注意:从来没有被添加到版本库就被删除的文件,是无法恢复的!
远程仓库
本地git连接到github网站
第一步,打开git命令面板,设置贡献者:
>git config --global user.email "你的邮箱"
git config --global user.name "你的用户名"
第二步,生成SSh
ssh-keygen -t rsa -C "注册邮箱"一路回车 找路径 找到文件夹.ssh下,会有两个文件,一般是在c盘下的用户 1. id_rsa 私钥 2. id_rsa.pub 公钥
第三步,找github中添加ssh项
第四步,测试是否连接成功
打开git命令面板 ssh -T git@github.com
注:github允许添加多个key,假如有若干电脑,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了
添加远程库
在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作。
首先,登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库 在Repository name填入名称,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库
现在,我们根据GitHub的提示,在本地仓库运行命令把本地仓库与远程库关联:
$ git remote add origin git@github.com:GoodMeng/10-13.git/添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库
下一步,就可以把本地库的所有内容推送到远程库上:
$ git push -u origin master把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令去掉-u。
从现在起,只要本地作了提交,就可以通过命令
$ git push origin master把本地master分支的最新修改推送至GitHub,现在,你就拥有了真正的分布式版本库
从远程库克隆
要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆
$ git clone git@github.com:*****/****.git
克隆到本地文件下
分支管理
创建与合并分支
创建分支:git branch name
切换分支:git checkout name或者git switch name
创建+切换分支:git checkout -b name或者git switch -c name
合并某分支到当前分支:git merge name
删除分支:git branch -d name
解决冲突
修改文件
在dev分支上提交
切换到master分支
在master分支上把文件提交
现在,master分支和dev分支各自都分别有新的提交,变成了这样
这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来 Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容 解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
用git log --graph命令可以看到分支合并图
分支管理策略
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活; 干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本 每个人都有自己的分支,时不时地往dev分支上合并就可以了
合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
git merge --no-ff -m "merge with no-ff" dev
合并后看分支历史
git log --graph --pretty=oneline --abbrev-commit
就像下面
$ git log --graph --pretty=oneline --abbrev-commit
* e1e9c68 (HEAD -> master) merge with no-ff
|\
| * f52c633 (dev) add merge
|/
* cf810e4 conflict fixed
Bug分支
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场;
在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick 命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
Feature分支
开发一个新feature,最好新建一个分支 如果要丢弃一个没有被合并过的分支,可以通过git branch -D 强行删除
多人协作
- 查看远程库信息,使用git remote -v;
- 本地新建的分支如果不推送到远程,对其他人就是不可见的;
- 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
- 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
- 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;
- 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。
一些常见错误
1.在windows平台下git add 的时候经常会出现如下错误
fatal: LF would be replaced by CRLF in --- 问题原因: git在windows下,默认是CRLF作为换行符,git add 提交时,检查文本中有LF 换行符(linux系统里面的),则会告警。所以问题的解决很简单,让git忽略该检查即可
解决方法:
git config --global core.autocrlf false
2.使用git log 只有光标闪烁,无法输入命令
解决方法:q