• git init 用来将某目录变成Git可以管理的仓库
  • 千万不要使用Windows自带的记事本编辑任何文本文件!!
  • git add <file>用来将xx文件添加进仓库,可反复多次使用,添加多个文件;git add .可以一次性添加所有改动的文件到仓库中
  • git commit -m用来把上一步添加的文件提交到仓库, -m后面是本次提交的描述,提交成功后会告诉我们有哪些改动
  • git status命令可以让我们时刻掌握仓库当前的状态,比如说xx文件已被修改但未提交
  • git diff可以看看具体修改了什么内容,显示的格式正是Unix通用的diff格式
  • git diff HEAD --<file>,可以查看工作区和版本库里面最新版本的区别
  • git log --pretty=oneline命令显示从最近到最远的提交日志,--pretty=oneline用来单行输出,看得更清楚(可不加)
  • 在Git中,用HEAD表示当前版本,HEAD^HEAD^^HEAD~100分别表示上一个、上上一个、上100个版本
  • git reset --hard <版本>可以回退到指定版本,这个版本是根据commit来的,每commit一次就是一个版本,一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失。但是如果把自己的本地版本库推送到远程仓库了,那么就不能回退了
  • 回退版本后可以通过git log中的commit id来返回回退之前的版本,前提是命令行窗口还没有被关掉,且知道要回去的版本的commit id的前几位;否则就需要通过git reflog来查看命令记录,每个commit 命令记录前会有相应的commit id
  • Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD指向回退版本,顺便把工作区的文件更新了!!
  • 工作区: 在电脑里能看到的目录
  • 版本库: 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

image

* 第一步是用`git add`把文件添加进去,实际上就是把文件修改添加到暂存区
* 第二步是用`git commit`提交更改,实际上就是把暂存区的所有内容提交到当前分支
* 即需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改到分支中(默认只有`master`分支)
* `git commit`只会提交暂存区中的文件,如果被修改的文件没有通过`git add`添加到暂存区中,那么就不会被`git commit`提交
  • Git比其他版本控制系统设计得优秀,是因为Git跟踪并管理的是修改,而非文件
  • git checkout -- <file>可以丢弃工作区的修改,就是让这个文件回到最近一次git commitgit add时的状态

    • file 自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态
    • file已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态
  • git reset HEAD <file>可以撤销掉(unstage)暂存区的修改,重新放回工作区
  • file修改后添加到暂存区了,又再次修改了,要想回到第一次修改前,可以如下操作

    • git checkout -- <file>回到第一次修改添加到暂存区后的状态,此时已丢弃第二次修改
    • git reset HEAD <file>撤销暂存区的修改,此时file回到第一次修改后,暂存区为空
    • 最后git checkout -- <file>丢弃工作区的修改,此时已丢弃第一次修改,回到原始状态

image

  • git rm用于删除一个文件(与git add一样执行后放到暂存区)。
  • 关联一个远程库

    • git remote add origin git@server-name:path/repo-name.git
    • git remote add origin <https>链接
    • 关联后,使用命令git push -u origin master第一次推送master分支的所有内容
  • 分支管理

    • 在Git里,master分支为主分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支
    • 切换到哪个分支,HEAD就指向哪个分支
    • git branch 查看分支,当前分支前面会有 *
    • git branch <name> 创建分支
    • git checkout <name> 切换分支
    • git checkout -b <name> ,加上-b表示创建并切换到新分支
    • git merge <name> 合并某分支到当前分支
    • git branch -d <name> 删除分支
    • 创建分支dev完成某个任务后,切换回master分支进行合并,再删掉dev分支,这和直接在master分支上工作效果是一样的,但过程更安全
  • 合并分支之解决冲突

    • 合并有时候会有冲突,此时git 会提示有冲突,需要我们手动解决冲突
    • 查看冲突文件会看到Git用<<<<<<<=======>>>>>>>标记出不同分支的内容
    • 修改冲突完毕后,即可git addgit commit
    • git log --graph可以看到分支合并图
    • git log --graph --pretty=oneline --abbrev-commit可以更清楚的看出分支合并的情况
  • 分支管理策略

    • master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活
    • 干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并master上,在master分支发布1.0版本
    • 每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
    • 合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而`fast forward合并就看不出来曾经做过合并

image

  • Bug分支

    • 修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除
    • git stash可以储藏工作现场
    • git stash list可以查看工作现场列表
    • git stash apply恢复工作现场,git stash drop删除stash内容
    • git stash pop恢复的同时把stash内容也删了,相当于上面的两步
    • 当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。
  • Feature分支、

    • 添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支
    • 丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除
  • 多人协作

    • 当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin
    • 查看远程库的信息,用git remote;用git remote -v显示更详细的信息
    • git push origin <name>推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支的名称,这样,Git就会把该分支推送到远程库对应的远程分支上
    • 多人协作的工作模式通常是下面这样

      1. 首先,可以试图用git push origin branch-name推送自己的修改;
      2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
      3. 如果合并有冲突,则解决冲突,并在本地提交
      4. 没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
      5. 如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name
  • 标签管理

    • 发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照
    • git tag <name>即可打标签,默认标签是打在最新提交的commit上的。要在特定的commit上打标签,需要用git reflog 找到历史提交的commit id, 然后使用git tag <name> <id>打上即可
    • git tag查看所有标签
    • git show <tagname>查看标签信息
    • git tag -a <tagname> -m "blablabla..."可以指定标签信息
    • git tag -s <tagname> -m "blablabla..."可以用PGP签名标签
    • git tag -d <tagname>删除本地标签
    • 创建的标签都只存储在本地,不会自动推送到远程,如果要推送某个标签到远程,使用命令git push origin <tagname>
    • git push origin --tags一次性推送全部尚未推送到远程的本地标签
    • git push origin :refs/tags/<tagname>可以删除一个远程标签
  • 忽略特殊文件

    • 在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件
    • .gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理
    • git check-ignore -v <file>可以检查某文件的忽略情况
  • 配置别名

    • git config --global alias.st status
    • 上面这一句告诉Git 以后 st 就代表 status
    • --global参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用

cshine
18 声望0 粉丝