安装git
linux系统安装
sudo yum install git
如果是基于Debian的发行版,即Ubuntu系统
sudo apt-get install git
mac系统安装
mac一般自带git
如果没有可到git官网进行下载:点击跳转官网下载安装包
直接下一步就可以。。。安装完成后,打开终端,输入git --version,即可显示版本。表示安装成功。
windows系统安装
到git官网进行下载:点击跳转官网下载安装包
直接下一步,可选择安装盘符。。。
安装完成后,点击右键会有Git Bash Here,点击后弹出命令行窗口,输入git --version,即可显示版本。表示安装成功。
git仓库的划分
Workspace:工作区,就是你在电脑里能看到的目录。
Index / Stage:暂存区,一般存放在 ".git目录下" 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。通过add命令将工作区内容添加到暂存区。
.git是我们初始化目录时git自动创建的一个隐藏目录,里面存放的是我们所有的版本信息。勿动!!!
Repository:仓库区(或本地仓库),工作区有一个隐藏目录.git。通过commit命令将暂存区内容添加到仓库区。
Remote:远程仓库。通过push命令将暂存区的内容提交到远程仓库。
项目管理流程
先将项目代码fork到自己的账号下
在github或器他代码管理平台上右上方都有一个fork,表示将该用户的代码,fork到自己的账号下。
从远程仓库clone代码
最好使用clone从仓库中将项目代码克隆岛本地,如果是维护老项目,不使用clone直接进行下载的时候,在提交代码时会全部检测为新添加内容。导致无法进行code review
git clone 代码仓库的地址
初始化仓库
mac/linux系统打开终端切换到要管理的目录下,win系统可进入项目文件夹后,右键-->点击Git Bash Here,弹出终端。
# 在终端中输入下面命令,等于是让git开始管理这个目录下的所有内容了 git init
查看目录状态
git status # 查看当前目录下有哪些文件有变化,会以红色内容显示,此时文件在工作区
添加内容到本地的暂存区
git add 后面加需要管理的文件/目录 例: git add . # 管理当前目录下的所有内容 git add test.py # 管理当前目录下的test.py文件 # 通过git add 管理的内容在查询状态时(git status)以绿色显示,即已经被管理到暂存区
个人信息配置
# 设置提交代码时的用户信息,即告诉git是谁提交的本次代码。 $ git config --global user.name "[name]" $ git config --global user.email "[email address]" 使用global参数表示你这台机器上所有的Git仓库都会使用这个配置,global不是非必须参数。 检查已设置的配置信息,使用$ git config --list命令
生成版本,即add后到暂存区的文件提交到本地仓库
注意:如果是初次使用git管理未进行个人信息配置,直接执行此步骤会报错,需要先进行个人配置,如上一步。
git commit -m "此处填写该版本的描述信息" # 提交暂存区的指定文件到仓库区,只是在上述命令中加入要提交的文件名 $ git commit [file1] [file2] ... -m [message] # 使用一次新的commit,替代上一次提交,如果代码有变化需要进行add # 如果代码没有任何新变化,则用来改写上一次commit的提交message信息 $ git commit --amend -m "message" # 提交时显示所有diff信息,比较鸡肋,因为每次提交时可通过git status查看状态 $ git commit -v
查看版本记录
# 查看版本 git log # 以流程的形式显示 git log --graph # 显示当前分支的最近几次提交 git reflog
版本回滚
已经进行commit后进行回滚
将(工作区)本地代码回滚到某个状态
git reset --hard 版本号 # 版本号可通过git log查看,想回滚到某个状态,版本号就是谁
回滚后如果还想再回到回滚之前的版本,还是通过上述代码进行,不过使用git log无法查到版本号,需要使用git reflog。
将本地仓库的代码回滚到暂存区,即回滚到add以后的状态
git reset --soft 版本号 # 将该版本号之前的版本回滚到暂存区
已经add后回滚
将add后(即暂存区版本)回滚到工作区
git reset HEAD # 执行完以后,再执行git status查看状态,会发现依然是红色,证明代码还在工作区。
从本地仓库直接回到工作区,即add之前状态
git reset --mix 版本号 # 该版本号的意思:将该版本号之前的版本回滚到工作区。
将本地修改撤销
git checkout . # 撤销工作区所有未进行add的文件内容修改,只针对于文件内容的修改,新增/删除文件无法撤销 git checkout 文件名 # 撤销对某一个文件内容的修改
分支
使用场景
多人协同开发,要创建自己的分支。
如果是已经上线的项目,需要开发新功能,但是此时项目出问bug了,那么就需要你进行紧急修复。如果没有分支,本地代码可能会受到影响,还需要涉及到代码冲突问题。
如果在开发新功能时,创建了单独的分支,那么在线上代码出问题时,可以直接切换到原来分支进行修改。
如果线上项目是一个分支dev1,自己正在开发的新功能是一个分支dev2,那么我们在切换回dev1分支时,本地代码会自动变成dev1时的状态,当dev1的bug修复完成后,可以再次切换到dev2分支,此时代码还是你正在开发时的状态。在dev1分支上修复的bug也不见了。
分支之间的代码互不影响
查看分支
查看所有本地分支
git branch
查看所有远程分支
git branch -r
列出所有本地分支和远程分支
git branch -a
创建分支
新建一个分支但是留在当前分支
git branch dev1 # 创建dev1分支
切换分支
切换分支,并更新工作区
git checkout dev1 # 切换到dev1分支,并更新工作区代码到当前分支
新建一个分支并切换到该分支
git checkout -b dev1 # 新建一个dev1分支,并切换到dev1分支上
删除分支
删除本地分支
git branch -d dev2 # 删除dev2分支
删除远程分支
git push origin --delete 远程分支名
合并分支
git merge bug # 合并bug分支到当前所在分支
合并分支时,会产生冲突,需要手动解决冲突后,提交。
线上项目bug修复
比如:master分支是我们线上跑的代码,此时我们开发新功能,需要建立一个新分支dev1,进行新的功能开发。此时项目出现bug,我们需要在master的基础上建立一个新的分支bug分支,然后在此分支上进行bug修复。此时相当于dev1分支和bug分支都是在master(线上代码分支)分支基础上进行的。修改完bug分支没有问题后,需要将bug分支代码合并到master分支上,然后将bug分支删除。此时再切换到dev1分支上继续开发,此时dev1分支上的bug还未修复。当dev1分支功能开发完毕后,要合并到master分支,此时会有冲突,需要手动解决冲突后,然后提交。
远程仓库
增加远程仓库
git remote add origin https://github.com/xxx/xxx.git(远程仓库地址) # origin 就是我们起的别名
将本地仓库代码推送到远程仓库
git push origin master origin 就是建立远程仓库连接时的别名 master 就是我们要提交到哪个分支
显示远程仓库信息
显示所有远程仓库
git remote -v
显示某个远程仓库信息
git remote show 远程仓库别名
取回远程仓库的变化,并与本地分支合并
git pull origin master # 指定从某个远程仓库取回代码 git pull origin https://github.com/xxx/xxx.git dev1
将git pull拆分
git pull origin dev1 上面代码,相当于 git fetch origin dev1 # 先将远程仓库代码拉到版本库 git merge orgin/dev1 # 将版本库中的代码合并到工作区
在远程仓库拉取代码过程可能出现的问题
- 在公司写了一个功能的代码,忘记提交。回到家后又写了另一个功能。第二天到公司后拉取代码可能或产生冲突。需要先手动解决冲突。
- 可能公司的代码让你先fork到你自己的github账号,然后让你对fork的代码进行修改,修改完成后通过pull request进行合并申请,与源代码合并。可能会出现,源代码一方将代码修改了,所以你需要与源代码同步。此时删除或者重命名你本地的那个分支,然后将远程仓库的分支删除。重新在本地建立分支,在本地git pull拉取源代码仓库的代码,直接git push 到你的仓库中,然后再将你之前可能添加新功能的代码进行合并。有冲突,先手动解决冲突。
rebase
将多个提交记录整合成一个
git push之前
commit 1cfce86cb8ceb0d9b8c5a6a7f0d49a5d554b6774 (HEAD -> dev1) Author: xxx <123456@qq.com> Date: Sun Dec 8 20:56:21 2019 +0800 版本3 commit ca334aaf85270b3283a7fc6e1b5c4d69cca7a5a7 Author: xxx <123456@qq.com> Date: Sun Dec 8 20:36:25 2019 +0800 版本2 commit 9e4adfceb1be1a9c5d63a71dae03fbfa5ba1d392 Author: xxx <123456@qq.com> Date: Sun Dec 8 19:13:13 2019 +0800 版本1
比如现在commit上面三条记录
# 第一种,按版本号 git rebase -i 9e4adf # 9e4adf版本号之后的版本到当前版本进行合并,不包含9e4adf # 第二种,使用HEAD git rebase -i HEAD~3 # 从当前开始最近的三条进行合并
执行完上述合并代码后,会出现如下代码,注释内容均是命令提示。
pick ca334aa 版本2 pick 1cfce86 版本3 # Rebase 9e4adfc..1cfce86 onto 9e4adfc (2 commands) # # Commands: # p, pick <commit> = use commit # r, reword <commit> = use commit, but edit the commit message # e, edit <commit> = use commit, but stop for amending # s, squash <commit> = use commit, but meld into previous commit # f, fixup <commit> = like "squash", but discard this commit's log message # x, exec <command> = run command (the rest of the line) using shell # b, break = stop here (continue rebase later with 'git rebase --continue') # d, drop <commit> = remove commit # l, label <label> = label current HEAD with a name # t, reset <label> = reset HEAD to a label # m, merge [-C <commit> | -c <commit>] <label> [# <oneline>] # . create a merge commit using the original merge commit's # . message (or the oneline, if no original merge commit was # . specified). Use -c <commit> to reword the commit message. # # These lines can be re-ordered; they are executed from top to bottom.
如果想要合并,我们需要将除第一个pick以外的pick改成s,意思是使用这个commit但是合并到上一个commit。结果如下:
pick ca334aa 版本2 s 1cfce86 版本3
然后切换到命令行模式,wq保存退出,然后会让你填写提交记录。
# This is a combination of 2 commits. # This is the 1st commit message: 版本2 # This is the 1st commit message #2: 版本3 # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # Date: Sun Dec 8 20:36:25 2019 +0800 # # interactive rebase in progress; onto 9e4adfc # Last commands done (2 commands done): # pick ca334aa 版本2 # squash 1cfce86 版本3 # No commands remaining. # You are currently rebasing branch 'dev1' on '9e4adfc'. # # Changes to be committed: # new file: xxx.py #
修改如下:可以自定义写记录,我这里写成版本2 & 版本3,然后切换到命令行模式,wq保存退出即可。
# This is a combination of 2 commits. # This is the 1st commit message: 版本2 & 版本3 # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # Date: Sun Dec 8 20:36:25 2019 +0800 # # interactive rebase in progress; onto 9e4adfc # Last commands done (2 commands done): # pick ca334aa 版本2 # squash 1cfce86 版本3 # No commands remaining. # You are currently rebasing branch 'dev1' on '9e4adfc'. # # Changes to be committed: # new file: xxx.py #
将分支记录插入到master,提交记录一条线
如果使用merge合并分支,那么在使用git log --graph时,会显示分支线路,使用rebase提交记录会显示在一条线上。
git checkout dev1 git rebase master # 将master分支上的代码与dev1合并 git checkout master git merge dev1 # 再将dev1上的代码合并到master上
将远程代码下拉,提交记录一条线
如果公司忘记提交到远程仓库,在家写了新的功能提交到远程仓库,那么第二天回到公司git pull会出现提交记录分叉现象。使用rebase
git fetch origin dev1 git rebase origin/dev1
执行rebase命令遇到冲突情况
遇到冲突,先手动解决冲突,解决冲突后,会提示执行git add,然后再执行git rebase --continue
快速解决冲突
使用beyond compare软件
安装
https://www.scootersoftware.com/download.php
在git中配置
git config --local merge.tool bc3 # 给工具命名 git config --local mergetool.path '/usr/local/bin/bcomp' # 安装路径 git config --local mergetool.keepBackup false # 解决冲突后不保留备份文件
应用beyond compare解决冲突
git mergetool