Git 学习指南

本贴最后更新于 2350 天前,其中的信息可能已经时移世异

安装 Git:
Linux 上安装 Git:
git 查看系统有没有安装 git
sudo apt-get install git ubuntu 安装 Git
sudo yum install git CentOS 安装 Git

手动编译安装:
下载源码解压
./config
make
sudo make install

git config --global user.name "You Name" 设置用户名
git config --global user.email "You Email" 设置邮箱
--global 参数表示这台机器上的所有 Git 仓库都会设用这个配置

git init 初始化仓库

git add filename 添加文件到仓库

git commit -m "提交说明" 提交文件到仓库

git status 查看仓库状态,跟 filename 查看指定文件状态,不加查看所有文件状态

git diff filename 查看文件做了那些修改,不指定文件名查看所有

git log 查看提交记录,加--pretty=oneline 参数。在一行显示

git reset --hard HEAD^ 回退到上个版本,HEAD^^ 回退到上上个版本,GEAD~100 回退上 100 个版本,commit id 回退或者恢复指定提交版本,无需全部 id 号,确定唯一即可

git reflog 记录每一次操作的命令,回退版本时在恢复,可使用此命令查看 commit id

git diff HEAD -- filename 对比工作区和版本库里面最新版本的区别

修改文件
执行顺序:git add filename
git commit -m ""
git add 提交 工作区文件到暂存区
git commit 提交暂存区文件到当前分支

修改文件
git commit -m ""
由于没有执行 git add 把工作区文件提交到暂存区 修改不生效

三种情况下的撤销修改:
1、文件只是修改没有 git add 也就没有 git commit -m ""
git checkout -- filename 注意 "--"必须,否则是切换分支

2、文件修改后 git add 到暂存区 没有 git commit -m "" 提交到分支
git reset HEAD filename 把暂存区的修改撤销掉,重新放回工作区
git checkout -- filename 丢弃工作区的修改

3、文件修改后 git add 到暂存区 并且 git commit -m "" 提交到分支
git reset --hard HEAD^ 回退上个版本

删除文件
vi filename 新建一个文件
git add filename 提交文件到暂存区
git commit -m "" 提交文件到版本库

rm filename 从本地删除文件

两种情况 从版本库删除文件 从版本库恢复文件 1、git rm filename 从版本库删除文件 git commit -m "" 并且提交到版本库 2、git checkout -- filename 从版本库恢复文件到本地,git rm filename 和 git checkout -- filename 执行过git rm 后执行git checkout -- filename 会报错,文件已经从版本库删除,无法再从版本库恢复

远程仓库:
创建 SSH Key:
ssh-keygen -t rsa -C "youremail@example.com" 替换邮箱,一路回车

添加远程仓库:
git remote add origin git@server-name:path/repo-name.git 关联远程仓库
git remote add origin git@github.com:username/repo-name.git
git remote rm origin 删除远程关联仓库

git push -u origin master 第一次推送 master 分支的所有内容

git push origin master 推送最新修改

克隆远程仓库:
git clone git@github.com:username/repo-name.git 克隆远程仓库到本地
git clone https://github.com/username/repo-name.git https 协议克隆仓库

查看分支:
git branche 查看所有分支,当前分标*

创建分支:
git checkout -b dev 创建分支并切换,加上-b 相当于:
git branch dev 创建分支
git checkout dev 切换分支

合并分支:
git merge dev 把当前分支合并到 master 分支
git branch -d dev 删除分支

合并分支前先切换到 master 分支:
git checkout master 切换分支
git merge dev 合并 dev 分支到 master 分支
git branch -d dev 删除 dev 分支

解决冲突:
git checkout -b feature 创建一个新的分支
修改 readme.txt 添加一行 Creating a new branch is quick AND simple
在 feature 分支提交
git add readme.txt
git commit -m "AND simple"

切换到master分支 git checkout master 修改readme.txt 添加一行 Crateing a new branch is quick & simple 在master分支提交 git add readme.txt git commit -m "& simple" 在master分支合并feature分支 git merge feature 提示冲突,必须手动解决 使用git status查看冲突文件 查看readme.txt 内容 git用<<<<<<<,=======,>>>>>>>标记不同分支的内容 修改readme.txt内容 Creating a new branch is quick and simle 在提交 git add readme.txt git commit -m "conflict fixed" git log --graph --pretty=oneline --abbrev-commit 查看分支合并情况 git log --graph 查看分支合并图 git branch -d feature 删除分支

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

使用--no-ff 的方式 merge:
git merge --no-ff -m "merge with no-ff" dev 以禁用 fast forward 方式提交,因为本次合并需要创建一个新的 commit,所以加上-m 参数,把 commit 描述写进去

合并后使用 git log 查看分支历史:
git log --graph --pretty=oneline --ahhrev-commit

分支管理原则:
master 分支应该是稳定的,仅用来发布新版本,平时不再上面干活
dev 分支,是不稳定的用来干活,到版本发布时,把 dev 分支合并到 master 分支上
每个人都有一个自己分支,时不时往 dev 分支上合并

Bug 分支
场景:当你接到一个代号 101 的 bug 时,很自然去创建一个分支 issue-101 来修复,但是在 dev 分支上的工作还没进行提交,因为工作还没有完成,bug 又要尽快修复,用到 git 提供的 stash 功能,把当前工作现场“储藏”起来,等恢复现场后继续工作。

git stash "储藏"当前工作现场

确定在那个分支上修改 bug

git checkout master 切换到待修复 bug 分支
git checkout -b issue-101 创建并切换到 bug 分支

修复后
git add filename 提交工作区文件到暂存区
git commit -m "" 提交暂存区文件到版本库

git branch master 切换到 master 分支
git merge --no-ff -m "" issue-101(bug 分支名)

git checkout dev 切换到 dev 分支

git stash list 查看“储藏”工作现场

恢复工作现场:
git stash apply 恢复后 stash 内容并不删除
git stash drop 删除 stash

git stash pop 恢复同时删除 stash 内容

多次 stash 恢复:
git stash list 查看有哪些 stash
git stash apply 恢复指定 satsh

feature 分支:
场景:开发新功能,先创建一个 feature 分支,开发好合并到 master 分支,最后删除 feature 分支
git checkout -b feature-vulcan 创建 feature 分支
git add vulcan.java (开发完成)新创建的文件添加到暂存区
git checkout dev 切换到到 dev 分支,准备合并
但是现在因为某些原因,新功能取消,虽然白干了,但是机密资料的分支还是要销毁
git branch feature-vulcan 删除分支,Git 提示分支没有合并不能删除,修改将丢失,如果要强行删除,需要使用大写-D 参数
git branch -D feature-vulcan 强制删除未合并过的分支

多人协作:
git remote 查看远程仓库信息
git remote -v 显示仓库详细信息,若是没有推送权限,看不到 push 地址
git push origin master 推送分支
git push origin branch-name 推送指定分支

抓取分支:
多人协作时,大家都会往 master 和 dev 分支上推送各自修改
git clone git@github.com:username/repo-name.git 默认抓取 master 分支
git checkout -b dev origin/dev 创建远程 origin 的 dev 分支到本地

git add filename 添加文件到暂存区
git commit -m "" 提交文件到版本库
git push origin dev 推送到指定分支,要是有最新提交和当前推送的提交有冲突,则无法推送。
git pull 先抓取远程分支修改,在本地合并,解决冲突,在推送

git branch --set-upstream-to=origin/dev dev 指定本地分支与远程分支 origin/dev 的分支链接

添加远程仓库并切换分支:
先在 git 添加 SSH Key
git clone git@github.com:username/repo-name.git 克隆远程仓库
git checkout -b branch-name 本地创建与远程仓库分支一样的分支
git branch --set-upstream-to=origin/远程分支名 本地分知名

Rebase:
git rebase 把分叉的提交历史“整理”成一条直线

创建标签:
git branch 查看当前所属分支
git checkout branch-name 切换到需要打标签的分支上
git tag tag-name 给当前分支打标签
git tag 查看所有标签
git tag tag-name commit-id 给已经提交的 commit 打标签
git show tag-name 查看标签信息
git tag -a tag-name -m "" commit-id 创建带有说明的标签,-a 指定标签名,-m 指定说明文字

操作标签:
git tag -d tag-name 按照标签名删除标签
git push origin tag-name 推送指定标签到远程仓库
git push origin --tags 推送所有标签到远程仓库

从远程仓库删除标签:
git tag -d tag-name 删除本地标签
git push origin :refs/tags/tag-name 删除远程仓库 tag

使用 GitHub:
参与一个开源项目,找到想参与的开源项目,fork 一下,在从自己的仓库 clone 到本地,修改后推送到远程仓库,如果希望开源项目接受自己的修改,就在 GitHub 上发起一个 pull request 给作者。
1、在 GitHub 上 Fork 开源项目
2、从自己的仓库 clone Fork 后的项目
3、在 GitHub 上发起 pull request,贡献代码到官方仓库

使用码云:
添加 ssh key
git remote add origin git@gitee.com:username/repo-name.git 关联本地仓库和远程仓库
git push
git pull

若是报错:fatal: remote origin already exists.说明本地仓库已经关联一个叫 origin 的仓库了
git remote -v 查看远程仓库信息
git remote rm origin 删除已关联的远程仓库

git remote add git@gitee.com:username/repo-name.git
git remote -v 已经正确关联可以愉快的 push 了

同步本地代码到两个远程仓库:
git remote rm origin 删除已关联的 origin 仓库
git remote add github git@github.com:username/repo-name.git 先关联 GitHub,远程库名叫 github
git remote add gitee git@gitee.com:username/repo-name.git 在关联 Gitee,远程库名叫 gitee

git mote -v 查看远程仓库信息,可以看到两个仓库

同时和多个远程仓库同步:
git push github master 推送到 GitHub
git push gitee master 推送到 Gitee
同时码云也可以 Pull Request

自定义 Git:
git config --global color.ui true 让 Git 显示颜色

忽略特殊文件:
针对需要又不能提交的文件,如配置文件
在 Git 工作区根目录创建一个 .gitignore 文件,把需要忽略的文件名填进去,Git 会自动忽略这些文件

或者直接使用 GitHub 为我们准备的各种配置文件:
https://github.com/github/gitignore

添加好之后把.gitignore 文件提交到 Git
在使用 git status 检验,是否输出:working directory clean

/xxx/xxx/* 忽略某个路径下的所有文件

git add -f filename 强制添加文件到 Git,文件被添加到.gitignore 忽略了,则需要使用此命令,强制添加

配置别名:
git config --global alias.st status 直接用 git st 就等于 git status
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch
git config --global alias.unstage 'reset HEAD' git reset HEAD filename
git config --global alias.last 'log -1' 显示最后一次提交内容
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

配置 git 的时候加上--global 时针对当前用户起作用,不加针对当前仓库起作用
配置文件在: .git/config
别名在[alias] 后面,要删除别名,删除对应行就行了
当前用户配置文件放在用户主目录下的一个隐藏文件.gitconfig 中
git 鼓励别名

搭建 git 服务器:
Ubuntu 下搭建 git 服务器:
1、安装 Git:
sudo apt-get install git
2、创建 git 用户
sudo adduser git
3、创建证书登录:
收集所有需要登录的用户公钥,就是 id_rsa.pub 文件,导入到/home/git/.ssh/authorzed_keys 文件里,一行一个
4、初始化仓库
先选择一个目录作为 git 仓库,假定是/srv/sample.git
cd /srv
sudo git init --bare sample.git 创建一个裸仓库

因为 git 仓库纯粹是为了共享,所以不让用户直接登录到服务器上更改工作区,并且服务器上的 Git 仓库通常都是以.git 结尾。然后把 owner 改为 git:
sudo chown -R git:git sample.git

5、禁用 shell 登录
编辑/etc/passwd 找到类似:
git: x:1001:1001:,,,:/home/git:/bin/bash
改为:
git: x:1001:1001:,,,:/home/git:/usr/bin/git-shell

这样 git 用户可以通过 ssh 使用 git 但是无法登录 shell,因为我们为 git 用户指定的 git-shell 每次一登陆就自动退出

6、克隆远程仓库
git clone git@server:/srv/sample.git

管理公钥,把每个人的公钥收集起来放到:
/home/git/.ssh/authorized_keys

公钥管理使用 gitosis
权限管理使用 gitolite

  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    211 引用 • 358 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    239 引用 • 224 回帖
  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    89 引用 • 150 回帖 • 1 关注
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    117 引用 • 99 回帖 • 203 关注
  • PWL

    组织简介

    用爱发电 (Programming With Love) 是一个以开源精神为核心的民间开源爱好者技术组织,“用爱发电”象征开源与贡献精神,加入组织,代表你将遵守组织的“个人开源爱好者”的各项条款。申请加入:用爱发电组织邀请帖
    用爱发电组织官网:https://programmingwithlove.stackoverflow.wiki/

    用爱发电组织的核心驱动力:

    • 遵守开源守则,体现开源&贡献精神:以分享为目的,拒绝非法牟利。
    • 自我保护:使用适当的 License 保护自己的原创作品。
    • 尊重他人:不以各种理由、各种漏洞进行未经允许的抄袭、散播、洩露;以礼相待,尊重所有对社区做出贡献的开发者;通过他人的分享习得知识,要留下足迹,表示感谢。
    • 热爱编程、热爱学习:加入组织,热爱编程是首当其要的。我们欢迎热爱讨论、分享、提问的朋友,也同样欢迎默默成就的朋友。
    • 倾听:正确并恳切对待、处理问题与建议,及时修复开源项目的 Bug ,及时与反馈者沟通。不抬杠、不无视、不辱骂。
    • 平视:不诋毁、轻视、嘲讽其他开发者,主动提出建议、施以帮助,以和谐为本。只要他人肯努力,你也可能会被昔日小看的人所超越,所以请保持谦虚。
    • 乐观且活跃:你的努力决定了你的高度。不要放弃,多年后回头俯瞰,才会发现自己已经成就往日所仰望的水平。积极地将项目开源,帮助他人学习、改进,自己也会获得相应的提升、成就与成就感。
    1 引用 • 487 回帖 • 3 关注
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 615 关注
  • 自由行
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖 • 1 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    76 引用 • 258 回帖 • 628 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    245 引用 • 1338 回帖 • 1 关注
  • OpenShift

    红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。

    14 引用 • 20 回帖 • 657 关注
  • Office

    Office 现已更名为 Microsoft 365. Microsoft 365 将高级 Office 应用(如 Word、Excel 和 PowerPoint)与 1 TB 的 OneDrive 云存储空间、高级安全性等结合在一起,可帮助你在任何设备上完成操作。

    5 引用 • 34 回帖
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 280 关注
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    59 引用 • 29 回帖
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 180 关注
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖
  • Wide

    Wide 是一款基于 Web 的 Go 语言 IDE。通过浏览器就可以进行 Go 开发,并有代码自动完成、查看表达式、编译反馈、Lint、实时结果输出等功能。

    欢迎访问我们运维的实例: https://wide.b3log.org

    30 引用 • 218 回帖 • 638 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖 • 3 关注
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    210 引用 • 2040 回帖
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 291 关注
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    181 引用 • 821 回帖
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    49 引用 • 192 回帖
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    952 引用 • 944 回帖
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 77 关注
  • 倾城之链
    23 引用 • 66 回帖 • 166 关注
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    25389 引用 • 104912 回帖
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 506 关注