[个人笔记] Git常用命令

最常用的命令:

日常提交最新变更:
git add deep_learning.txt
git commit -m "comment message"
git push origin HEAD:master
git pull origin

# 查看远程URL地址:
git remote -v

# 查看远程分支:
git branch -r

合并dev分支到master分支:
1.先把本地当前分支切换成master: 
  git checkout master
2.拉取一遍远端仓库最近的代码: 
  git pull 
3.把本地dev分支合并到master分支:
  git merge dev
4.把本地的master分支提交到远端master分支: 
  git push
5.把本地分支切换回dev: 
  git checkout dev

帮助命令:git help command

Git架构图:

 

 

  1. 获取远程代码:
    git clone -b branch 远程仓库的地址

如果是本地新增git库初始化,可用命令:git init

  1. 本地修改代码:
    git add file_name 将写的文件提交到暂存区
    git commit -m “提交备注” 将暂存区的文件提交到本地仓库,
    (切记这只是本地仓库,还未分享出去*)
    git push 提交到远程仓库,这时你的同事就可以看见了
    git status 查看提交状态
    git log 查看提交日志

修改最近一次提交(commit)的注释:
git commit –amend
详细说明

3. 回退代码版本:
有两种思路:
1. 用reset,强回退,会导致别人commit的中间版本的更新记录丢失
2. 用revert, 使用新加一次 commit 的方式,回退之前特定一次提交版本,别人提交的更新记录不会丢失。
实践中,需要回退时,应尽可能使用 revert来操作,避免因个人的失误导致团队其它人的commit丢失。

revert基本用法: git revert -n commit_id
示例网页

reset的用法:
git reset –hard HEAD^
HEAD is a pointer, point to the current version of file
HEAD^ HEAD^^ … HEAD~100
You can change HEAD to point to diff ID to change history version

将文件从暂存区回退到工作区
git reset HEAD filename
回退整个版本:
一个^表示一个版本,可以多个,另外也可以使用:git reset HEAD~n这种形式
git reset HEAD^

3.1 如果回退错了,希望恢复被回退的版本
先通过:git reflog查看哈希值
再使用:git reset 哈希值返回

3.2 git reset 三种模式区别介绍
–hard: 强制回退,放弃之前commit的所有内容
–soft:回退后,之前commit的内容会被放到缓冲区,即 stage 状态,相当于改动的文件已被 git add
(mixed) 无参数时默认 mixed:回退后,之前commit 的内容都变成 unstage 的状态,可以工作目录中看到未提交的内容
介绍文章

4. 分支相关命令:
git branch 查看你当前所在的分支
git branch name 创建分支
git checkout -b branchName 当前所在分支创建新分支
git checkout branchName 切换分支
git merge branchName 合并branchName分支到当前分支
git git cherry-pick (-n) commitId(SHA) 挑拣(多个)一个提交到当前分支

5.临时保存本地修改过的代码,先不放到提交范围里:
git stash list 查看保存的工作进度
git stash 保存工作进度
git stash pop 来恢复保存的工作状态

6.比较代码差异:
git diff 工作空间和暂存区的区别
git diff HEAD 工作空间和版本库的区别
git diff –cached 暂存区和版本库的区别

7.在远程git服务器上新增一个仓库
echo "# lihongyi" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/username/reposname.git
git push -u origin master

8.合并时报错:Pulling is not possible because you have unmerged files
原因:当前分支有一个文件因为有修改,没有被合并,这时checkout或pull都会失败
处理方案:强制冲掉这个文件的修改,返回上一次提交的节点
命令:git reset –hard FETCH_HEAD

9.删除不需要跟进的文件及文件夹
命令:git clean -fd [files or folder]

10.合并其它分支的某次提交到当前分支
git log
git checkout cur_branch
git cherry-pick (commitid)

11.删除分支
删除本地分支: git branch -d [branch name]
删除远程分支: git push origin –delete [branch name]

12.合并其它分支单个文件
如果使用git merge命令,会将整个A分支都合并到B
如果只想合并某一个文件,应该使用git checkout -p(–patch)
git checkout -p A file.txt
如果merge过程中遇到冲突,在手动解决完冲突后,可通过git add 命令告诉git冲突已解决

注:分支A可以是远程的分支,也可以是本地分支,远程分支应该写origin/A,如果只写A则默认是本地分支。

冲突合并思路:
通过git stash命令,把工作区的修改提交到栈区,目的是保存工作区的修改
通过git pull命令,拉取远程分支上的代码并合并到本地分支,目的是消除冲突
通过git stash pop命令,把保存在栈区的修改部分合并到最新的工作空间中

12-1. 让分支树的展示更简洁
git rebase 可以在合并代码后,让整个分支树呈现完美的线性
与之相比, git merge 合并后可能存在分支树的情况
相关介绍说明

Rebase 黄金法则
最后必须要提到一条 rebase 黄金法则:绝不要在公共的分支上使用它。 git rebase 会重写历史,一定只能在你自己的分支上使用它, 否则你的队友们可能会暴打你一顿。

13.列出远端所有分支
git branch -r

14.以 bare 方式在远端上创建库存(创建仓库/初始化库存)
mkdir /home/name/repos/project_name.git
cd /home/name/repos/project_name.git
git init –bare 创建裸仓库
从裸仓库clone下来的本地仓库可以进行正常的push操作,但从一般仓库clone下来的本地仓库不能push。
裸仓库不包含工作区,所以不存在在裸仓库上直接提交变更的情况。
裸仓库一般是作为远程的中心仓库而存在的。

15. 使用stash临时存储不打算提交的内存至栈中
临时保存当前分支修改,先不提交(要在add 之前操作)
git stash save "msg"
以栈的方式存储,先进后出

16. 找出代码提交者
git blame file -L a,b 打印出file中行数在a,b之间的的内容,并会显示每一行代码的提交者信息

17. 获取远程最新信息 并 合并至本地分支
git fetch 获取远端有而本地没有的数据
git merge alias 将服务器上的任何更新(假设有人这时候推送到服务器了)合并到当前分支

18. 删除 Untracked files
git clean -f 会强制删除未add到git中的文件
-d 连目录一起删除
-x 连 ignored files 文件一起删除
-X 只删除 ignored files

19. 各类型merge合并参数

20. git merge时空格处理参数

临时保存功能

背景:当你不想提交当前完成了一半的代码,但是却不得不修改一个紧急Bug,那么使用’git stash’就可以将你当前未提交到本地(和服务器)的代码推入到Git的栈中,这时候你的工作区间和上一次提交的内容是完全一样的,所以你可以放心的修 Bug,等到修完Bug,提交到服务器上后,再使用’git stash apply’将以前一半的工作应用回来。 引用自

stash 基本操作

查看当前临时保存的列表
git stash list

将当前stash中的内容弹出,并应用到当前分支对应的工作目录上。
该命令将堆栈中最近保存的内容删除(栈是先进后出)
git stash pop

将堆栈中的内容应用到当前目录,不同于git stash pop,该命令不会将内容从堆栈中删除
git stash apply

从堆栈中移除某个指定的stash
git stash drop + 名称

清除堆栈中的所有 内容
git stash clear

查看堆栈中最新保存的stash和当前目录的差异。
git stash show

 

参考资料:http://blog.csdn.net/txw910/article/details/53998951

利用hook实现自动部署
解决方案参考

Gitflow实践分支设定
最佳实践

主要工作流程:

1. 初始化项目为gitflow, 默认创建master分支, 然后从master拉取第一个develop分支
2. 从develop拉取feature分支进行编码开发(多个开发人员拉取多个feature同时进行并行开发, 互不影响)

3. feature分支完成后, 合并到develop(不推送, feature功能完成还未提测, 推送后会影响其他功能分支的开发)
    合并feature到develop, 可以选择删除当前feature, 也可以不删除 . 但当前feature就不可更改了, 必须从release分支继续编码修改

4. 从develop拉取release分支进行提测, 提测过程中在release分支上修改BUG

5. release分支上线后, 合并release分支到develop/master并推送
     合并之后, 可选删除当前release分支, 若不删除, 则当前release不可修改 . 线上有问题也必须从master拉取hotfix分支进行修改

6. 上线之后若发现线上BUG, 从master拉取hotfix进行BUG修改

7. hotfix通过测试上线后, 合并hotfix分支到develop/master并推送
    合并之后, 可选删除当前hostfix, 若不删除, 则当前hotfix不可修改, 若补丁未修复, 需要从master拉取新的hotfix继续修改

8. 当进行一个feature时, 若develop分支有变动, 如其他开发人员完成功能并上线, 则需要将完成的功能合并到自己分支上
    即合并develop到当前feature分支
9. 当进行一个release分支时, 若develop分支有变动, 如其他开发人员完成功能并上线, 则需要将完成的功能合并到自己分支上
    即合并develop到当前release分支 (!!! 因为当前release分支通过测试后会发布到线上, 如果不合并最新的develop分支, 就会发生丢代码的情况)

git面试常见问题

win10 docker搭建gitlab
gitlab代码评审