51

10分钟带你入门git到github

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzU0OTE4MzYzMw%3D%3D&%3Bmid=2247489258&%3Bidx=3&%3Bsn=c9e6a52faf6453e1d7628f0a213e5edc
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

git的产生背景

iy2ERnv.png!web

很多人都知道,Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了。Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为Linux编写代码,那Linux的代码是如何管理的呢?事实是,在2002年以前,世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码!你也许会想,为什么Linus不把Linux代码放到版本控制系统里呢?不是有CVS、SVN这些免费的版本控制系统吗?因为Linus坚定地反对CVS和SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。有一些商用的版本控制系统,虽然比CVS、SVN好用,但那是付费的,和Linux的开源精神不符。不过,到了2002年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满,于是Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。安定团结的大好局面在2005年就被打破了,原因是Linux社区牛人聚集,不免沾染了一些梁山好汉的江湖习气。开发Samba的Andrew试图破解BitKeeper的协议(这么干的其实也不只他一个),被BitMover公司发现了(监控工作做得不错!),于是BitMover公司怒了,要收回Linux社区的免费使用权。Linus可以向BitMover公司道个歉,保证以后严格管教弟兄们,嗯,这是不可能的。实际情况是这样的:Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!牛是怎么定义的呢?大家可以体会一下。Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。历史就是这么偶然,如果不是当年BitMover公司威胁Linux社区,可能现在我们就没有免费而超级好用的Git了。

git 的安装

本文使用的是win7平台。 Git 可以在 LinuxUnixMacWindows 这几大平台上安装了,可以根据自己的操作系统去官网下载。 ye2MVbJ.png!web

git 常见命令

介绍命令之前先来张图吧,所有的命令都是围绕张图的 M7ruArY.png!web

  • Workspace:工作区,就是你平时存放项目代码的地方

  • Index / Stage:暂存区,用于临时存放文件的改动,事实上它只是一个文件,保存即将提交到文件列表信息。

  • Repository:本地仓库区(或版本库),就是安全存放数据的位置,这里面有我们提交到所有版本的数据。其中 HEAD 指向最新放入仓库的版本。

  • Remote:远程仓库,托管代码的服务器。弄清楚上面四个概念,我们就开始实操吧。

  • 通过 git init 命令创建 Git 可以管理的仓库( 本地库初始化 )


Administrator@XCRBHXD05IEZEVS MINGW64 /d
$ mkdir gitstudy

Administrator@XCRBHXD05IEZEVS MINGW64 /d
$ cd gitstudy/

Administrator@XCRBHXD05IEZEVS MINGW64 /d/gitstudy
$ git init
Initialized empty Git repository in D:/gitstudy/.git/

执行完这个命令我们可以看到文件下面会多一个 .git 的文件夹,以后在这个文件夹下( 工作区 )的都可以被 git 管理了。 ARjmMfa.png!web

  • git add 命令把文件添加到 暂存区 。下面我们创建( echo >文件名字)一个 demo.txt 文件
$ echo > demo.txt

2qI3e2I.png!web 此时的 demo.txt 文件是带个蓝色 的,当我们执行 git add - demo.txtfyYFBbI.png!web 那如果这个目录下面有几百个文件都要加到 暂存区 怎么办?此时可以使用 git add . 这个命令可以把当前目录下所有文件加入 暂存区

  • git status 查看显示 工作区暂存区 的状态。
$ git status
  • git commit -m"提交信息描述" 命令把文件添加到 本地仓库
$ git commit -m"第一次提交"
[master (root-commit) 22f0a2b] 第一次提交
1 file changed, 1 insertion(+)
create mode 100644 demo.txt

提交后 demo.txt 颜色是不是变绿了。 vYBJ7nq.png!webfIf2uyj.png!web

  • git commit -am"文件描述"
    am
    add modify
    git commit -am
    
git commit -am"第三次提交"

如果新增了文件,必须使用分开的命令,不能用合并命令。

git add .
git commit -m 'update'

回退

未使用git add(文件必须是commit 过的)

  • 使用 git checkout -- filename (文件名)注意中间有 --
$ git checkout -- demo.txt
  • 回退所有的文件修改使用 git checkout .
 git checkout .

已使用git add,未使用git commit

  • 使用  git reset HEAD filename (指定文件名)
git reset HEAD demo.txt
  • 回退所有文件修改  git reset HEAD
 git reset HEAD

在使用本命令后,本地的修改并不会消失,而是回到了上面 未使用 git add 缓存代码,继续使用用 git checkout -- filename ,就可以放弃本地修改。

已使用 git commit 未push

  • git reset --hard HEAD^ 回退到上一次commit的状态( 这个命令需谨慎执行 )。 HEAD^ (代表上一次)或者通过 git reset --hard <commitid> ( 是版本号 可以根据 git log 查看,每次 commit 都会生成一个)
 git reset --hard HEAD^
  • git reset --mixed HEAD^ ( --mixed 也可以省略),保留 工作区 ,并且清空 暂存区 。就是回到上一次 git add 之前。
git reset HEAD^
  • git reset --soft HEAD^ 重置 HEAD 到指定的版本,不会修改 暂存区暂存区 就是回到上一次 git commit 之前,适用于合并commit节点。
git reset --soft HEAD^
  • git revert <commitid> 会回退到 之前的那次提交,会产生一个新的 commit ,将这次回退作为一次修改记录提交,这样的好处是不修改历史提交记录。
 git revert e241441d8a85b2d89

已使用 push

  • git push -f 可以在本地执行以上操作后,然后强行推送到远程仓库
git push -f

删除

  • git rm <文件名> 这个必须是 commit 之后的文件
 git rm demo.txt
  • git rm -f <文件名>
    add
    commit
    
 git rm -f 4.txt

远程仓库

  • 以上都是在本地仓库进行操作的,提交的代码别人也是看不到的,如果写着代码硬盘坏了咋办?那是不是所有的代码都没了。所以写完了代码赶紧推送到服务器上去。

添加远程库

用命令 git remote add origin git@server-name:path/repo-name.git; 关联远程仓库

关联之前肯定要在远程创建仓库

  • 首先要到 https://github.com/全球最大同性交友网站 上注册一个账号。已有账号的就忽略了。

  • 接下来就是新建一个远程仓库了。 7jumMrB.png!webFFruI3j.png!web

 git remote add origin [email protected]:workit1/studygit.git

关联后,使用命令 git push -u origin master 第一次推送 master 分支的所有内容。

git push -u origin master

以后,每次本地提交后可以使用命令 git push origin master 推送最新修改到远程仓库。

从远程库克隆

  • 前面我们了解先有本地仓库,再有远程库的时候,如何关联远程库。但是一般实际开发中我们是先有远程仓库的,然后从远程库克隆。 jyqyEr.png!web

 git clone https://github.com/workit1/gitstudy.git

分支管理

  • git checkout -b <创建分支名> 表示创建并切换分支
Administrator@XCRBHXD05IEZEVS MINGW64 /d/gitstudy (master)
$ git checkout -b feature_a
Switched to a new branch 'feature_a'

基于 master 分支创建了 feature_a 分支并且切换到了 feature_a 分支。

  • git checkout <name> 或者  git switch <name> 切换分支
 git checkout master
  • git branch -a 查看所有分支,包含远程分支
  • git branch 查看本地所有分支
  • 合并分支

git merge master

当有冲突的时候这里会个正在合并的状态

  • 取消合并,此时你如果不想合并了,可以使用 git merge --abort 取消。
git merge --abort
  • 删除分支

  1. 删除本地分支 git branch -d <name>
 git branch -d feature_a
  1. 删除远程分支 git branch -D <name>

实际项目中如果我们需要开发一个功能完整的流程是什么样的呢?多数公司模式应该下面这样的流程吧。1.先基于主干分支 拉出一个功能分支( feature_xx )进行开发。2.开发完成后测试基于这个功能分支进行测试。3.测试完成后,开发把功能分支合并到主干分支。合并代码操作如下:

  1. 先切换到主干分支( release ),主干分支 git pull 拉下远程分支最新代码(可能有同事提交了新的代码)
  2. 切回到功能分支 把本地主干最新代码合( git merge )并到当前功能分支,如果合并有冲突就解决冲突后重新提交。
  3. git merge
    merge request
    review
    
  4. 合并完主干分支后,功能分支就可以删除了。

总结

  • 以上命令基本上可以应付工作中大多数场景了,不过 git 还有很多高级的玩法。如果大家想更深入学习了解的话,我这边为大家整理了一份 Git 的学习资料,从学习入门到高阶。还有 git所有命令的思维导图 。公众号【 java金融 】回复【 git 】就可以免费获取了。 QJzq63E.png!web
  • 还为大家找了一个可以在线练习 git 的学习网站。赶紧去试试吧,超级有意思,相信你一口气就通关了。https://learngitbranching.js.org/?locale=zh_CN r2UBRrm.png!web
  • 视频地址https://www.bilibili.com/video/BV1Xt4y1X73x/

结束

  • 由于自己才疏学浅,难免会有纰漏,假如你发现了错误的地方,还望留言给我指出来,我会对其加以修正。

  • 如果你觉得文章还不错,你的转发、分享、赞赏、点赞、留言就是对我最大的鼓励。

  • 感谢您的阅读,十分欢迎并感谢您的关注。

  • 特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:

    eEjEFnz.jpg!web

    长按订阅更多精彩▼

    rEFzyej.jpg!web

    如有收获,点个在看,诚挚感谢

参考 https://www.liaoxuefeng.com/wiki/896043488029600/896202780297248

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK