Git 学习

一、基本操作

  • 将当前目录初始化一个git仓库
    git init
  • 将文件快照放入暂存区域
    git add 文件
  • 提交更新,找到暂存区域的文件,将快照永久存储到git仓库
    git commit -m "提交信息,建议写有意义的详细信息,方便从历史记录中找到改动记录"
    可以多次git add 不同文件,commit一次将暂存区所有修改提交
  • 查看仓库当前状态
    git status
    下面的命令输出告诉我们,demo.txt被修改过,但未提交
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   demo.txt

no changes added to commit (use "git add" and/or "git commit -a")

  • 查看修改的内容
    git diff 文件
  • 查看提交日志
    git log
    如果看的眼花缭乱,可以加上--pretty=oneline
  • 回退到某一版本
    git reset --hard 某一版本 回退到往上100个版本
    HEAD表示当前版本
    HEAD^表示上一个版本
    HEAD^^表示上上一个版本
    HEAD~100表示往上100个版本
  • 回到之前最新版本
    git reset --hard 版本id id越长越好,不然容易找到多个版本号
    1. 在命令行窗口还没关闭的情况下,找到那一版本的commit id(一串十六进制)
    2. Git提供了一个命令记录你的每一次命令
      git reflog
      可以从中找到对应commit id
  • 撤销修改
    git checkout -- 文件
    回退到最近一次git commitgit add时的状态
    命令中--很重要,没有就变成“切换到另一个分支”
  • 撤销暂存区的文件,重新放回工作区
    git reset HEAD 文件
  • 删除文件
    git rm 文件
    • 第一种情况 git rm并且 git commit 将删除版本库的文件。
    • 第二种情况git checkout -- 文件 将被删除的文件恢复到最新版本。

二、远程仓库

  • 创建SSH Key
    ssh-keygen -t rsa -C "邮箱" 会在用户主目录下生成.ssh目录
    id_rsa私钥,不可泄露
    id_rsa.pub公钥,可以告诉任何人
  • 在GitLab上添加SSH密钥(公钥)
  • 在GitLab中创建仓库,并复制仓库的SSH格式的URL(注意不是地址栏的URL)
添加远程仓库
  • 关联远程库,在本地仓库下运行命令
    git remote add origin 仓库URL 这里是GitLab仓库的URL
    其中origin是远程库的名字,可以修改。
  • 将本地库内容推送到远程库
    git push -u 远程库名称 master
      用git push命令,实际上是把当前分支master推送到远程。
      由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
      从现在起,只要本地作了提交,就可以通过命令git push 远程库名称 master推送到GitLab
从远程库克隆
  git clone 远程仓库的URL  
  //这样本地仓库就已经将远程仓库项目克隆下来了。

三、分支管理

  因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。

  • 创建并切换分支
    git checkout -b 分支
    git checkout 命令加上 -b表示创建并切换,相当于一下两条命令
    git branch 分支
    git checkout 分支
  • 查看当前分支
    git branch

  • 切换分支
    git checkout 分支

  • 合并指定分支到当前分支
    git merge 指定分支

  • 删除分支
    git branch -d 分支

  • 解决冲突

修改dev分支后

$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)
//修改分支后,从分支切换到master时,Git还会自动提示我们当前master分支比远程的master分支要超前1个提交。

如果此时再修改master分支内容,合并时会提示冲突

$ git merge feature1
Auto-merging demo.txt
CONFLICT (content): Merge conflict in demo.txt
Automatic merge failed; fix conflicts and then commit the result.
//Git告诉我们,demo.txt文件存在冲突,必须手动解决冲突后再提交。

git status也可以告诉我们冲突的文件
在文件内容中Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容
将冲突的内容统一,解决冲突内容后重新提交即可。

  • 查看分支合并情况
    git log --graph --pretty=oneline --abbrev-commit
    git log --graph查看分支合并图
分支管理策略

  通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。

  • 禁用Fast forward模式,创建分支
    git merge --no-ff -m "详细合并信息" dev
BUG分支

  软件开发中,bug就像家常便饭一样。有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。
  当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,但是,当前正在dev上进行的工作还没有提交。
  并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?
  幸好,Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等修改BUG以后恢复现场继续工作:

  • 将当前工作现场“储藏”起来,等以后恢复现场继续工作
    git stash
    现在用git status查看工作区,工作区就是干净的(除非没有被Git管理的文件)
  • 查看“储藏”的工作现场
    git stash list
  • 恢复最近一次“储藏”的工作现场
    git stash apply
    恢复指定工作现场,通过git stash list查看工作现场的序号,将(stash@{序号})追加到命令后面
    注意,序号越靠后,说明储藏的时间越长
    这样恢复后,stash内容并不会删除,需要手动删除
  • 删除“储藏”的工作现场
    git stash drop
  • 恢复并删除“储藏”的工作现场
    git stash pop
  • master分支出现bug,说明dev同样也存在,Git专门提供了命令,让我们复制一个特定的提交到当前分支
    git cherry-pick 特定的提交id
Feature分支

  软件开发中,总有无穷无尽的新的功能要不断添加进来。
  添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。
  如果在feature分支还没有合并前,需要取消这个功能,删除时会销毁失败,需要使用大写的-D参数强制删除。
   git branch -D 分支

多人协作

  当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。

  • 查看远程库的信息
    git remote -v -v表示详细信息
  • 推送分支
    git push 远程库名称 本地分支名称
  • 抓取分支
    git clone 远程仓库的URL 默认只能看到本地的master分支
    如果要在dev分支上开发,就必须创建远程origin的dev分支到本地
    git checkout -b dev origin/dev 创建并且还dev分支,并将远程库origin/dev 弄下来
    如果最新提交和你推送的提交有冲突,先用git pull把最新提交抓下来,然后在本地合并,解决冲突,再提交。
//git pull 失败
$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.

    git pull <remote> <branch>

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream-to=origin/<branch> dev
//原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接
  • 设置本地分支dev与远程分支origin/dev的链接
    git branch --set-upstream-to=origin/dev dev

  • 多人协作工作模式
    尽量将冲突在本地解决

  1. pull远程库内容到本地先进行合并
  2. 如合并冲突,则解决冲突
  3. 如没有冲突或解决后,再commit 并push到远程库

四、遇到的问题

  • HTTP Basic: Access denied 错误
  1. 如果账号密码变动,使用git config --system --unset credential.helper 重新输入账号密码
  2. 如果第一条命令解决失败,使用git config --global http.emptyAuth true
  3. 还可以进入 控制面板>>用户账号>>凭据管理器>>windows凭据>>普通凭据 ,在里面找到git,可以编辑用户密码
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Git 是目前最流行的分布式版本控制系统之一。 版本控制指的是,记录每次版本变更的内容和时间等细节,保留各版本之间...
    神齐阅读 1,470评论 0 7
  • 声明:这篇文章来源于廖雪峰老师的官方网站,我仅仅是作为学习之用 Git简介 Git是什么? Git是目前世界上最先...
    横渡阅读 3,988评论 3 27
  • 这篇博文是自己在学习git过程中的思考总结。本文仅仅代表个人的看法,如有不妥地方还请本文文末留言。 😊 原文链接g...
    Ming_Hu阅读 1,147评论 4 18
  • 安装Git Git的下载地址:Git官网下载地址 Git本地仓库和命令 配置用户 下载完Git后,右键会有一个Gi...
    TokyoZ阅读 4,540评论 1 7
  • 教程网址:http://www.liaoxuefeng.com/wiki/0013739516305929606d...
    maybenai阅读 714评论 0 1