文章目录
git 安装
mac下安装git
mac下安装git有四种方法,查看是否有安装git,可以在命令行下输入git
如果安装成功了,会显示这样
usage: git [--version] [--help] [-C <path>] [-c <name>=<value>]
[--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
[-p | --paginate | --no-pager] [--no-replace-objects] [--bare]
[--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
<command> [<args>]
....
- 直接下载安装包,下载地址
- 用homebrew指令下载,不过首先需要安装homebrew
- 安装homebrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
- 安装git
brew install git
- 通过Xcode安装
- 直接从AppStore安装Xcode,Xcode集成了Git,不过默认没有安装,你需要运行Xcode,选择菜单“Xcode”->“Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”就可以完成安装了。
- 我就是输入了git之后,就弹出一个
然后跟着一路安装就OK了。xcode-select: note: no developer tools were found at '/Applications/Xcode.app', requesting install. Choose an option in the dialog to download the command line developer tools.
配置git
设置用户名和邮箱
- 查看用户名和邮箱
git config user.name
git congfig user.email
- 设置username和email(github每次commit都会记录他们)
以后也可以修改的,用同样的语句git config --global user.name "your name" git config --global user.email "your email xxx.com"
生成密钥
Git关联远端仓库时候需要提供公钥,本地保存私钥,每次与远端仓库交互时候,远端仓库会用公钥来验证交互者身份。使用以下指令生成密钥。
ssh-keygen -t rsa -C "your_email@youremail.com"
然后会有以下输出,一路enter
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/leo/.ssh/id_rsa):
Created directory '/Users/leo/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/leo/.ssh/id_rsa.
Your public key has been saved in /Users/leo/.ssh/id_rsa.pub.
......
关联github
在终端打开你的key,例如我的地址如上一步所示,保存在/user/leo/.shh
因此我在命令行中输入
cd /user/leo/.shh
cat id_rsa.pub
回车会输出你的key
然后打开github
- 进入setting
- 进入ssh and gpg keys
- 点击new ssh key
- 名字随便起
- 然后把key复制进去
链接验证
ssh -T git@github.com
Hi xxx! You've successfully authenticated, but GitHub does not provide shell access.
将项目上传到github
在github新建仓库
在本地上传
进入到那个文件夹git bash here
git init
git add . //添加到暂存区
git commit -m "update"
git remote add origin 你的远程地址 //关联到远程库
git pull --rebase origin master
//获取远程库与本地同步合并(如果远程库不为空必须做这一步,否则后面的提交会失败)
git push -u origin master //第一次
git push origin master //第一次之后
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
其他
版本回退
- HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
- 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
- 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
撤销修改
- 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout – file。
- 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD ,就回到了场景1,第二步按场景1操作。
- 场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
删除文件
命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
添加远程库
git remote add origin git@server-name:path/repo-name.git
创建与合拼分支
- 查看分支:git branch
- 创建分支:git branch
- 切换分支:git checkout
- 创建+切换分支:git checkout -b
- 合并某分支到当前分支:git merge
- 删除分支:git branch -d
合并分支时,加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
解决冲突
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
用git log --graph命令可以看到分支合并图。
Bug分支
- 当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。
- 用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
- 用git stash pop,恢复的同时把stash内容也删了
- 用git stash list查看
理解:工作区和暂存区是一个公开的工作台,任何分支都会用到,并能看到工作台上最新的内容,只要在工作区、暂存区的改动未能够提交到某一个版本库(分支)中,那么在任何一个分支下都可以看得到这个工作区、暂存区的最新实时改动。
使用git stash就可以将暂存区的修改藏匿起来,使整个工作台看起来都是干净的。所以要清理整个工作台,那么前提是必须先将工作区的内容都add到暂存区中去。之后在干净的工作台上可以做另外一件紧急事件与藏匿起来的内容是完全独立的
多人协作
-
查看远程库的信息,用git remote
-
显示更详细的信息,用git remote -v
-
本地新建的分支如果不推送到远程,对其他人就是不可见的;
-
从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
-
在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
-
建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;
-
从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。
Rebase
- rebase操作可以把本地未push的分叉提交历史整理成直线;
- rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
创建标签
- 命令git tag 用于新建一个标签,默认为HEAD,也可以指定一个commit id;
- 命令git tag -a -m "blablabla…"可以指定标签信息;
- 命令git tag可以查看所有标签。
忽略特殊文件
- 忽略某些文件时,需要编写.gitignore;
- .gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理!