git总结

199 阅读8分钟

创建版本库

通过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 强行删除


多人协作

  1. 查看远程库信息,使用git remote -v;
  2. 本地新建的分支如果不推送到远程,对其他人就是不可见的;
  3. 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
  4. 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
  5. 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;
  6. 从远程抓取分支,使用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