iterm2+Git使用

前言: 最近在实习,写文章的频率下来了很多,开几篇文章写写在实习中学到的东西吧。

一、Git的使用

git的主要功能

  1. 版本控制:想要记录历史版本以备可能会需要回溯到某个版本的可能,避免手动为每一个历史版本做一个副本,git会帮助你记录历史版本。

  2. 合作开发:可以同时多个人分别自己开发,最后能合到一起。

  3. 分布式?:每个人都有完整的版本库,同时开发的人可以互相推送分支然后合并成新版本(实际似乎不是这样)。

git的基本概念

git仓库

开始使用git需要在要管理的目录下初始化一个git仓库。

git init  #初始化git仓库

会在当前目录下自动生成.git文件夹(里面的内容以后在了解),记录历史版本、提交、分支、用户配置等。

工作区、暂存区和版本库

  • 工作区:正在修改的,尚未加入暂存区的文件在工作区。

  • 暂存区:准备提交到版本库的文件存在暂存区。

  • 版本库:当所有工作区的修改都进入暂存区,commit提交后成为一个版本。

git add foo  #将文件foo加入暂存区git status  #查看工作目录状态git commit -m "desc"  #将暂存区文件提交并附上描述

有了上面三个概念就有了版本控制。

工作区的修改可以从暂存区或版本库中的记录恢复,也可以加入暂存区。

git checkout -- foo  #将工作区的foo修改作废,恢复至暂存区或版本库中的版本

暂存区的文件可以恢复到工作区也可以回退成版本库中的版本。

git reset HEAD foo  #将HEAD指针所指向版本库中的foo文件恢复到暂存区。该操作影响暂存区,不影响工作区内容。

也可以使工作区回到指定版本。

git reset --hard HEAD^  #工作区恢复到HEAD的前一个提交,工作区的修改全部丢失。

分支

在一个commit之后像树分叉一样两个分支独立生长。 开发者可以拥有自己的工作分支,随时提交到自己的分支而不影响主分支。开发完成后再进行合并,解决冲突(如果你的分支和主分支上同时修改了相同的文件)后,主分支上也有你的工作了。

以下流水账。

基本操作

创建版本库

** git init ** git add some.file $ git commit -m "description"

版本回退

** git status ** git reflog $ git reset --hard commit_id

撤销修改

从工作区撤销修改

$ git checkout -- filename

可以撤销工作区文件的修改,回退到暂存区,如果未进入暂存区,则回退到版本库。如果被追踪的文件被删除同样可以找回。

从暂存区撤销修改

$ git reset HEAD filename

所有撤销修改仅限于影响被追踪的文件

删除文件

让git不再记录文件,使用

$ git rm filename

文件将从版本库中删除。

远程仓库

关联远程仓库和从远程克隆

** git remote add origin git@server-name:path/repo-name.git ** git clone [email protected]:foo/bar.git

分支管理

一个分支是一串提交串成的时间线。分支可以从某个点分化成不同分支各自发展。不同的分支间可以合并。

创建、切换与合并

** git branch name ** git checkout name ** git checkout -b name ** git merge name $ git branch -d name

  • merge分支可能会产生冲突,需手动解决。

  • 更重要的是生产环境中一般不允许merge,而是提交pull request。

  • 问题:fast-forward模式是如何丢失分支信息的

保存现场

$ git stash

可以将工作区和暂存区的修改保存起来,此时可以切换分支进行开发。切换回来想恢复现场,则使用

$ git pop

更多stash

** git stash list ** git stash apply $ git stash drop

feature分支

通常在开发新特性时都会用到。命名以feature开头。强制删除分支的命令是

$ git branch -D name

fork 和 pull request

  • GitHub类网站的一个功能。想向别人的项目提交代码却没有权限,可以先fork别人的代码,自己修改并提交,然后向项目管理者发起pull request,申请把你的代码合并到他的分支里。

  • 生产过程中也需要用pull request而不是merge来提交代码。

自定义git

颜色、name和email

** git config --global color.ui true ** git config --global user.name "Your Name" $ git config --global user.email "[email protected]"

.gitignore

忽略掉不想track的文件如密码配置等,使其不在git status时提示。GitHub上推荐的各种工程.gitignore文件

规则

官方文档

新加入的规则不会忽视已经track的文件,status仍会提示,此时应untrack这些文件。

** git rm -r --cached . ** git add . $ git commit -m 'update .gitignore'

设置别名

设置alias可以让使用更方便。

** git config --global alias.co checkout ** git config --global alias.ci commit $ git config --global alias.br branch

那如何取消设置呢

config文件

仓库的配置

每个仓库的.git/config

用户的配置

~/.gitconfig

问题

git是支持分布式的,但现实中似乎还是使用了一个中心服务器。开发时先pull下来再开新分支开发然后push,所以比SVN好在哪。(commit是本地的,push和pull时需要网络;SVN可以修改文件但没网不能提交)

为什么要有暂存区,如果只是好看可以修改完然后提交所有。

分支好难说。

merge的fast-forward方式和noff方式对分支合并前后的影响。

.git文件夹下的内容。

二、zsh+iterm2 中Git快捷键

屏幕快照 2018-07-10 上午9.59.29.png
屏幕快照 2018-07-10 上午9.59.49.png
屏幕快照 2018-07-10 上午10.00.02.png

你可能感兴趣的:(iterm2+Git使用)