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,可以编辑用户密码
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容

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