Git 分布式版本控制系统
核心概念
- Workspace:工作区
- Index / Stage:暂存区
- Repository:仓库(或本地仓库)
- Remote:远程仓库
- commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 commit id是一个SHA计算出来的一个非常大的数字,用十六进制表示防止冲突
分支
分支策略
一般在实际开发中,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活,干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本,开发人员每个人都有自己的分支,时不时地往dev分支上合并就可以了。所以,团队合作的分支看起来就像这样:
创建dev分支:
git checkout -b dev master
将 dev 分支发布到Master分支的命令:
git checkout master # 切换到 Master 分支
git merge --no-ff dev # 对 dev 分支进行合并
git branch -d dev # 删除 dev 分支
合并分支时,加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
git status
用于查看在你上次提交之后是否有对文件进行再次修改
Changes not staged for commit: 已修改未git add到暂存区
(use “git add …” to update what will be committed)
(use “git restore …” to discard changes in working directory)
Changes to be committed: 已git add到暂存区可提交
(use “git restore --staged …” to unstage)
Untracked files: 新增文件
(use “git add …” to include in what will be committed)
**Changes to be committed:**表示已经从工作区add到暂存区的file(文件或文件夹),可以通过 git restore --staged filename 命令将该file从暂存区移出,只有工作区有该文件,该文件就为Untracked files。
临时任务或 Bug 修复
- 当前在dev分支,工作只进行到一半,还没法提交,但必须马上修复bug,怎么办?
git stash # 临时保存修改
- 现在创建分支来修复bug。首先确定要在哪个分支上修复bug,假定需要在master分支上修复,就从master创建临时分支:
git checkout master # 切换master分支
git checkout -b issue-101 # 新建分支
git add readme.txt # 添加修改
git commit -m "fix bug 101"
- 修复完成后,切换到master分支,并完成合并,最后删除issue-101分支:
git switch master
git merge --no-ff -m "merged bug fix 101" issue-101
- 可返回到dev分支干活, 恢复保存的现场
git switch dev
git stash list
stash@{0}: WIP on dev: f52c633 add merge
git stash pop # 恢复的同时把stash内容也删了
# 或 2步
git stash apply # 恢复
git stash drop # 删除
git stash apply stash@{0}
- 同样的bug,要在dev上修复
我们只需要把4c805e2 fix bug 101这个提交所做的修改“复制”到dev分支。注意:并不是把整个master分支merge过来。为了方便操作,Git专门提供了一个cherry-pick命令,让我们能复制一个特定的提交到当前dev分支
git cherry-pick 4c805e2 # 将对应commit提交到dev分支。
设置本地分支对应远程分支的两种方法
# 1. 增加一个新的远程仓库,并在本地命名为origin
git remote add origin [Remote Url]
git push -u origin test # Set upstream when pushing to remote 适用于第一次关联并提交
# 2. Set upstream without pushing it with option -u / --set-upstream-to 适用于仅设置远程关联
git branch -u origin/test
git branch --set-upstream-to=origin/test
撤销修改
- git add/rm 之前
git checkout . //是撤销从上次提交之后所做的所有修改
git checkout filename //是撤销从上次提交之后的单个文件的修改
git restore <file> //撤销修改
- git add/rm 之后,还未git commit
情况一:从暂存区撤出
git restore --staged
git reset HEAD //reset 某个文件, 保留修改
git reset HEAD . //reset 所有, 保留修改
情况二:git rm 的文件
git checkout – file_name
三、撤销修改 git commit -m “” 、还未执行git push
- 找到上次git commit的 id,找到你想撤销的commit_id
git log //查看日志
- 完成撤销,同时将代码恢复到前一commit_id 对应的版本
git reset --hard commit_id //执行撤销
注:不保留commit 之前修改的代码,reset之后,代码回滚到上个版本
3.完成Commit命令的撤销,但是不对代码修改进行撤销,可以直接通过git commit 重新提交对本地代码的修改。
git reset commit_id //注释
注:保留commit之前修改的代码,撤销后,代码是修改后的状态,还能继续修改
四、对于已经push的版本,进行回退
1、第一步:
git reset --hard 版本号 //本地回退到指定的版本
2、第二步:
git push -f origin dev //将远程的也回退到指定版本
Git撤销提交
撤销命令:
$ git reset --hard HEAD^ 回退到上个版本
$ git reset --hard HEAD~3 回退到前3次提交之前,以此类推,回退到n次提交之前
$ git reset --hard commit_id 退到/进到 指定commit
推送到远程:
$ git push origin HEAD --force
git clone 含有子模块的项目
当一个 git 项目包含子模块(submodule) 时,直接克隆下来的子模块目录里面是空的。
有两种方法解决:
方法一 如果项目已经克隆到了本地,执行下面的步骤:
git submodule init #初始化本地子模块配置文件
git submodule update #更新项目,抓取子模块内容。
方法二 在执行 git clone 时加上 --recursive 参数。它会自动初始化并更新每一个子模块。例如:
git clone --recursive https://github.com/example/example.git
常用指令
git config –global user.name "name"
git config –global user.email "email address"
git init [dir] # 在当前目录或指定目录dir创建一个新的代码库
git clone [url] [dir]# 通过指定的URL获取一个代码库到指定目录。
git add [file] # 将一个文件修改添加至stage(暂存区)。Add file contents to the index
git add * #将多个文件添加至stage(暂存区)。
git rm [file1] [file2] # 删除工作区文件,并且将这次删除放入暂存区
git mv [file-original] [file-renamed] # 改名文件,并且将这个改名放入暂存区
git diff # 显示暂存区和工作区的差异
git diff HEAD # 显示工作区与当前分支最新commit之间的差异
git diff HEAD -- readme.txt
git diff --cached [file] # 显示暂存区和上一个commit的差异
git commit -m "message" # 在版本历史记录中永久记录文件。
git commit --amend -m [message] # 替代上一次提交,代码没有任何新变化,则改写上一次提交信息
git commit -a #提交git add命令添加的所有文件,并提交git add命令之后更改的所有文件。
git diff #显示尚未添加到stage的文件的变更。
git diff --staged # 显示添加到stage的文件与当前最新版本之间的差异。
git diff [first branch] [second branch] # 显示两个分支之间的差异。
git reset [file] # 从stage中撤出指定的文件,但可以保留文件的内容。
git reset [commit] # 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
git reset HEAD [file] # 可以把暂存区的修改撤销掉
git reset --hard [commit] # 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
git reset --hard HEAD^ # 回退到上一个版本
git status # 显示所有需要提交的文件。
git rm [file] # 删除工作目录中的文件,并将删除动作添加到stage。
git log [--pretty=oneline] # 显示当前分支的版本历史记录。
git log -5 --pretty --oneline # 显示过去5次提交
git log --graph --pretty=oneline --abbrev-commit # 分支合并图
git log --follow [file] # 显示某个文件的版本历史记录,包括文件的重命名。
git show [commit] # 显示指定提交的元数据以及内容变更。
git tag [commitID] # 给指定的提交添加标签。
git push [remote] [tag] 提交指定tag
git branch # 显示所有的本地分支。
git branch -vv # 显示所有的本地分支。
git branch -r # 显示所有的远程分支。
git branch [branch name] # 创建一个分支。
git branch -d [branch name] # 删除指定的分支。
git branch [branch] [commit] # 从指定commit新建一个分支
git branch -a # 查看所有本地及远程分支
git branch --set-upstream-to=origin/分支名 分支名 # 本地分支关联远程分支
git branch --set-upstream [branch] [remote-branch] # 建立追踪关系,在现有分支与指定的远程分支之间
git checkout [branch name] # 切换分支。
git checkout -b [branch name] # 从当前分支创建一个分支,并切换到新分支上。
git checkout -b [branch] origin/[remote-branch] # #从远程分支创建本地分支
git checkout -b feature-x develop
git checkout -b [branch] [tag] # 新建一个分支,指向某个tag
git checkout . # 恢复暂存区的所有文件到工作区
git checkout -- [file] # 丢弃工作区修改,用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
git checkout [commit] [file] # 恢复某个commit的指定文件到暂存区和工作区
git merge [branch name] # 将指定分支的历史记录合并到当前分支。
git fetch [remote] # 下载远程仓库的所有变动
git remote # 显示所有远程仓库
git remote -vv # 可以查看你当前项目的远程git地址
git remote show [remote] # 显示某个远程仓库的信息
git remote add [remote name] [Remote Url] # 增加一个新的远程仓库,并命名
git push [remote name] master # 将主分支上提交的变更发送到远程代码库。
git push -u origin master # 将master分支上提交的变更发送到远程代码库,还会把本地的master分支和远程的master分支关联起来。
git push -u origin master:test # 以本地 master 分支创建远程 test 分支,并设置关联-u,适用于添加个人分支
git push [remote name] [branch] # 将指定分支上的提交发送到远程代码库。
git push –all [remote name] # 将所有分支发送到远程代码库。
git push [remote name] :[branch name] #删除远程代码库上的一个分支。
git pull [Repository Link] #获取远程服务器上的变更,并合并到你的工作目录。
git pull [remote] [branch] # 取回远程仓库的变化,并与本地分支合并
git stash save # 临时保存所有修改的文件。
git stash pop # 恢复最近一次stash(储藏)的文件。
git stash list # 显示stash的所有变更。
git stash drop # 丢弃最近一次stash的变更。
git reflog # 记录你的每一次命令
配置
Git SSH 配置
- 生成 sshkey
ssh-keygen -t rsa -C “xxxxx@xxxxx.com” - 添加生成的 public key 添加到远程仓库中。
cat ~/.ssh/id_rsa.pub | clip - 测试 ssh -T git@xxxxxxx.com
约定
任务要在对应仓库创建分支,例如:taskno-1234-title,每日结束,即时任务完不成,也要提交代码。
参考文档 常用命令
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。