安装git
- linux上安装git
- 查看是否安装了git git
- 在Debian 或者 Ubuntu Linux上可以进行安装 sudo apt-get install git
- 或者使用源码进行安装 Git官网上下载源码 解压 依次输入 ./config -> make -> sudo make intall
- Max OS X上安装git
- 通过homebrew安装
- 安装xcode,xcode中集成来了git, 运行xcode,选择xcode->Preferences, 选择Downloads->Command Line Tools -> Install
- Windows上安装git
- git官网上下载安装程序,按默认选项安装即可
- 开始菜单 -> Git -> Git Bash。
创建SSH Key
SSH key提供一种与Github通信的方式,通过这种方式,能够在不输入密码的情况下,将github作为自己的remote端服务器进行版本控制。
步骤:
- 检查SSH keys是否存在
- 生成新的ssh key
- ssh-keygen -t rsa -C “xxxx@xxxx.com”
- 将ssh key添加到git hub中
设置名称和邮件
git config 命令 --global参数,用了这个参数代表这台机器上的所有git仓库都会使用这个配置,也可以针对某个参数指定不同的用户名和email地址
$ git config --global user.name "Your name"
$ git config --global user.email "email@example.com"
创建版本库
版本库就是仓库,可以理解为一个目录,这个目录下的所有文件都可以被GIT管理起来,每个文件的修改,删除,GIT都能跟踪。以便在任何时刻都可以追踪历史,或者在将来某个时刻可以还原。
-
创建一个目录
-
通过git init命令把这个目录变成git可以管理的仓库 可以通过ls -ah查看.git目录
-
把文件添加到版本库
- 在创建好的git仓库下新建一个文本文件,编码最好使用UTF-8格式
- 使用命令git add readMe.txt文件来添加到仓库 git add
- git add 命令可以一次提交多个文件 git add | git add -a
- 使用命令git commit -m 把文件提交到仓库
git add readMe.txt git commit -m "add readme file"
修改文件
-
使用git status查看文件状态
-
使用git diff 查看文件的修改内容
-
确认无误后可以将修改的文件添加到仓库后进行提交
git status git diff <filename> git add <filename> git commit -m <message>
版本回退
文件修改到一定程度的时候,就可以保存一个快照,这个快照在git中被称为commit,一但文件被删除了后者改乱了,就可以从最近的一个commit恢复,然后继续工作。
git中,用HEAD表示当前版本 上一个版本是HEAD^ 上上一个版本就是HEAD^^ 在往后就是HEAD~100
- 使用git log查看历史修改记录 一行模式 git log --pretty=oneline
- 使用git reset命令恢复当前版本到上一个版本 git reset --hard HEAD^ 也可以通过commit id来指定回退的版本
- 通过git reflog来查看历史命令,以便确定回到后续的哪个版本
工作区与暂存区
我们创建git版本库的时候,git自动为我们创建了一个唯一的master分支,所以git commit就是往master分支上提交更改。
需要提交的文件修改放在暂存区,然后一次性提交暂存区的所有修改。
add 是将本地的修改提交的暂存区。
git comit提交的内容是已经放入暂存区的内容,未放入暂存区的修改将不会提交的分支上。
可以通过git diff HEAD – 将指定文件与指定版本进行对比
撤销修改
可以使用 git checkout – 可以丢弃指定文件的修改 意思为把filename文件在工作区的修改全部撤销。
工作区的文件已经修改但是未被放入暂存区,撤销修改就回到版本库一致的状态
工作的文件修改已经放入暂存区后又做了修改,撤销修改就回到暂存区后的状态
$ git checkout -- readMe.txt #把readMe.txt文件在工作区的修改全部撤销 --很重要,没有--就是切换分支的命令
版本回退的三种情况
- 工作区修改, 为提交到暂存区 git checkout –
- 工作区进行修改后提交到暂存区,但是未提交到代码库 git reset HEAD
- 工作区的修改已经提交到代码库上,需要使用版本回退到为修改之前的版本。(前提是未推送到远程版本库)
#update a file and commit to the branch.
git reset --hard HEAD^
git reset HEAD <filename>
git checkout -- <filename> #其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以还原
删除文件
文件删除之后,可以选择确认删除,使用git rm ,然后进行commit
如果是误删除,可以使用git checkout – 来进行恢复
远程仓库
- 创建SSH Key. $ ssh-keygen -t rsa -C “youremail@example.com”, 用户主目录下就可以找到.ssh目录。
- .ssh目录下面有id_rsa 和 id_rsa.pub两个文件. id_rsa是私钥,id_rsa.pub是公钥
- 登陆GitHub,打开Account setting, SSH Keys里面设置id_rsa.pub里面的内容。
添加远程库
- 在github上创建一个远程仓库,可以从这个仓库克隆新的仓库,也可以把一个已有的本地仓库与之关联,然后把本地仓库的内容推送到github仓库上。
- 在本地仓库下运行命令 git remote add origin git@github.com:account/gitrepo.git。添加远程库的名字就是origin.
- 把本地的所有内容推送到远程库上 git push -u origin master. 把当前分支master推送到远程。-u参数,git不但会把本地的master分支内容推送到远程新的master分支,还会把本地master分支和远程分支关联起来。
- git pull origin 拉取远程库代码
删除远程库
- 查看远程库信息 git remote -v
- 根据名字删除 git remote rm origin, 删除其实是解除本地和远程的绑定关系,并不是物理上删除了远程库,远程库本身并没有任何改动。
克隆远程库
- github上创建远程库
- 本地克隆github上的仓库 git clone git@github.com:account/gitrepo.git
分支管理
创建和合并分支
-
创建分支 git branch newBranch
-
切换分支 git checkout newBranch
-
创建并进行切换 git checkout -b newBranch -b参数表示创建并切换
-
查看分支 git branch -v 会列出所有分支,当前分支前面会标出一个*号
-
在分支上进行修改并提交到分支上。git merge dev 将dev分支上的内容合并到master分支上。
-
删除分支 git branch -d dev
-
建议使用分支完成某个任务,合并后再删除分支。
使用switch命令来操作分支
- 创建并切换到新的分支 git switch -c dev
- 直接切换到现有的分支 git switch master
分支相关命令汇总
git branch #查看分支 git branch -v
git branch <name> #创建分支
git checkout <name> #切换分支 或者 git switch <name>
git checkout -b <name> #创建并切换分支 或者 git switch -c <name>
git merge <name> #合并某分支到当前分支
git branch -d <name> #删除分支
冲突解决
- 当需要合并的代码库上的改动都有修改的时候进行合并就有可能会出现冲突。
- 出现冲突就需要手动解决,手动解决了冲突后再提交。git status也可以告诉我们冲突的文件。
- 解决冲突后再讲修改的文件提交到代码仓库中
- 可以使用git log --graph --pretty=oneline --abbrev-commit查看分支合并的情况
分支合并策略
分支合并时,git会使用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息
强制禁用Fast forward模式 git就会在merge时生成一个新的commit。
git switch -c dev #创建新的分支
git add readMe.txt #修改分支文件并提交到新的代码仓库
git commit -m "add merge"
git switch master #切换到master分支
git merge --no-ff -m "merge with no-ff" dev #不使用Fast forward模式进行合并
git log --graph --pretty=oneline --abbrev-commit
分支策略
master分支是非常稳定的,用来发布新的版本,平时不在上面进行修改
使用分支进行修改,新版本发布的时候,再将分支上合并到master上。
修复问题
master为主版本库,dev为当前开发的版本库,现在有一个问题需要进行修复。但是目前开发版本库中的代码还不能进行提交。
- 使用stash功能来暂存当前分支上的代码 git stash
- 暂存后切换到需要修复bug的分支上,创建分支进行修复。
- 修复完成后,切换到master分支,并完成合并,最后删除修复bug的分支。
- 切换到开发分支,使用暂存区的内容进行恢复现场.
- git stash list 查看工作现场
- git stash apply 恢复 需要使用 git stash drop来删除 git stash apply stash{0}
- git stash pop 恢复的同时把stash内容也删除
- 在其他分支上可以使用cherry-pick命令来赋值一个特定的提交到当前分支。
git branch -v # 查看当前分支列表
git switch -c dev #创建工作分支
git stash # 暂存当前工作分支上的修改
git switch master #切换到主分支
git switch -c issue-101 #创建修复问题的分支
git add readMe.txt
git commit -m "fix bug on issue-101"
git switch master #切换到主分支
git merge --no-ff -m "merge bug fix on issue-101" issue-101
git switch dev #切换到工作分支
git cherry-pick <version> #复制某一个版本的改动到当前分支
git stash list #查看当前工作分支上的暂存列表
git stash pop #使用stash的记录来恢复现场
分支再未合并时需要强制删除
开发一个新功能的时候可以使用分支来进行开发
分支修改内容未合并时,需要删除可以使用 git branch -D feature2
多人协作
从远程仓库克隆时,实际上git自动把本地的master分支和远程的master分支对应起来。并且远程仓库的默认名称是origin.
- 可以使用 git remote | git remot -v 来查看远程库信息, 可以看到pull和push的地址。如果没有推送权限,是没有push的地址。
- 分支也可以推送到远程, 再推送时需要指定本地分支。 git push origin master | git push origin dev
- 抓取分支 clone下来的仓库只能看到本地的master分支。需要在dev分支上开发就必须创建远程origin 的 dev分支到本地 使用 git checkout -b dev orgin/dev
- 设置dev和origin/dev的链接 git branch --set_upstream-to = origin/dev dev
工作模式
git remove -v # 查看远程库信息
git push origin <branch-name> #推送自己的修改
git pull #如果推送失败,因为远程分支比你的本地更新,需要使用git pull试图合并
#在解决冲突后再次推送
git push origin <branch-name>git checkout -b branch-name origin/branch-name #在本地创建和远程分支对应的分支
git branch --set-upstream-to <branch-name> origin/<branch-name> #建立本地分支与远程分支的链接关系
rebase
rebase操作的特点 把分叉的提交历史整理成一条直线,看上去更直观,缺点是本地的分叉提交已经被修改过了
标签管理
tag就是一个让人容易记住的有意义的名字 它跟某个commit绑在一起
- 切换到需要打标签的分支上, 然后 git tag 就可以打一个新标签
- 可以使用git tag查看所有的标签
- 默认标签是打在最新的commit上,也可以指定commit打标签 git tag v1.0
- 使用git show 查看标签信息
- 可以创建带有说明的标签 -a 指定标签名 -m指定说明文字 git tag -a v1.0 -m “version 1.0”
- 标签总是和某个commit挂钩,如果commit即出现在master分支也出现在其他分支,那么分支上都可以看到标签
git tag #显示所有标签git tag <tagname> #给最后一次提价信息打上标签
git tag -a <tagname> -m "tag message" <commit id> #给指定提交添加带有描述信息的标签
git show <tagname> #显示标签信息
操作标签
- 标签也可以删除 git tag -d v0.1
- 标签推送到远程 git push origin | 推送所有标签 git push origin --tags
- 如果标签已经推送到远程,删除远程标签需要
- 先删除本地标签 git tag -d
- 删除远程标签 git push origin : refs/tags/v0.9
Github使用
- 在github上fork任意开源项目
- 自己拥有fork后的仓库的读写权限
- 可以推送pull request给官方仓库来贡献代码。
Gitee的使用
如何把本地的项目关联到gitee上的仓库
- 本地库上使用命令git remote add 把它和gitee远程库关联 git remote add origin git@gitee.com/repo.git
- 如果之前已经关联了远程库添加远程库会报错
- 使用git remote -v 查看远程库信息
- 使用git remote rm origin来删除远程库,删除之前的远程库后再进行关联
- 关联远程库的时候可以指定远程库的名字 git remote add github git@github.com/repo.git
- 在关联了远程仓库后,需要先拉取远程仓库上的代码 使用git pull进行拉取若git pull拉取失败可以尝试 git pull origin master --allow-unrelated-histories。
- 在提交本地的修改 git push origin master
自定义git
git上有一些可以配置的内容
- 让git显示颜色 git config --global color.ui true
忽略特殊文件
有些文件不需要往仓库上进行提交,但是使用git status时会显示这些文件Untracked files的状态
在git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去
忽略文件需要编写 .gitignore
.gitignore文件本身要放在版本库里,并且可以对.gitignore做版本管理
git add -f App.class #强制添加一个在忽略文件里面的文件进版本关联
git check-ignore -v App.class #排除所有.开头的隐藏文件#排序所有.class的文件
.*
*.class
*.py[cod]
*.so*.egg
*.egg-info
dist
build
Thumbs.db
Destop.ini
#不排除以下文件
!.gitignore
!App.class
配置别名
给一些命令设置别名
配置git的时候 --global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用
修改的配置存放在.git / config中
当前用户的git配置信息放在用户主目录下的一个隐藏文件 .gitconfig中
#设置status的别名为st
git config --global alias.st 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 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服务器
- 安装git sudo apt-get install git
- 创建一个git用户,用来运行git服务 sudo adduser git
- 创建登陆证书 将证书写入/home/git/.ssh/authorized_keys文件
- 初始化git仓库 先选定一个目录作为git仓库 /urv/sample.git/ 在/srv目录下输入命令 sudo git init --bare sample.git这样会创建一个裸仓库,裸仓库没有工作区 把owner改为git sudo chown -R git:git sample.git
- 禁用shell 编辑/etc/passwd文件 将git :x : 1001:1001:,:/home/git:/bin/bash 改为 git :x : 1001:1001:,:/home/git:/usr/bin/git-shell
- 克隆远程仓库 git clone git@server:/srv/sample.git