GIT学习笔记10bet

来源:http://www.chinese-glasses.com 作者:Web前端 人气:57 发布时间:2020-04-15
摘要:时间: 2019-09-30阅读: 89标签: git1. 你最喜欢的 Git 命令是什么 git config --global user.name "lanbin"git config --global user.email "imlanbin@163.com"git init 个人比较喜欢git add-p.这增加了“补丁模式”的变化,

时间: 2019-09-30阅读: 89标签: git1. 你最喜欢的 Git 命令是什么

git config --global user.name "lanbin"git config --global user.email "imlanbin@163.com"

git init

个人比较喜欢git add -p.这增加了“补丁模式”的变化,这是一个内置的命令行程序。它遍历了每个更改,并要求确认是否要执行它们。

创建完毕目录会多了个.git的隐藏文件夹

这个命令迫使咱们放慢速度并检查更改文件。作为开发人员,咱们有时常常急于提交,我自己也经常这样,做完运行git add .才发现把调试的代码也提交上去了。

  • HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
  • 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
  • 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
  1. 为什么你更喜欢直接使用 git 命令

10bet 1image

作为开发人员,咱们也经常使用其它命令来做其它事情,也不差用git的命令来做事。

  1. git add把文件添加进去,实际上就是把文件修改添加到暂存区;

  2. git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

  3. git status查看状态

  4. git diff HEAD -- readme.txt命令可以查看工作区和版本库里面最新版本的区别

  5. git checkout -- readme.txt可以丢弃工作区的修改

  6. git reset HEAD <file> 可以把暂存区的修改撤销掉,重新放回工作区

  7. git rm test.txt删掉文件,并且git commit

  8. 在文件系统上误操作删除了文件,可以用git checkout -- test.txt还原

此外,git命令也是非常短的,非常容易学习,并且使用命令可以了解git的工作流程,这样也间接改进了开发工作流程。

10bet 2image10bet 3image

  1. 如何使用stage命令

GIT把内容按元数据方式存储,而SVN是按文件方式存储,git管理的是修改而不是文件;

stage是add .的内置别名。

SVN在Commit前,我们都建议是先Update一下,跟本地的代码编译没问题,并确保开发的功能正常后再提交,这样其实挺麻烦的,有好几次同事没有先Updata,就Commit了,发生了一些错误,耽误了大家时间,Git可能这种情况会少些。

4.如何在分支中保存更改并checkout到其他分支

  1. 首先登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库

  2. 添加到远程仓库

因此,可以使用git stash临时存储更改或提交 WIP,目的是要有未修改前的环境。就我个人而言,我更喜欢使用 WIP 提交而不是stash,因为它们更容易引用和共享。

WIP = Work in Progress

git remote add origin git@github.com:lanbin/learngit.git

研发中的代码想存储起来,但是又避免研发中的代码被合并,开发就会创建一个WIP的分支

远程库的名字就是origin

WIP MR

  1. 推送到远程仓库

WIP MR含义是 在工作过程中的合并请求,是一个我们在 GitLab 中避免 MR 在准备就绪前被合并的技术。只需要添加WIP:在 MR 的标题开头,它将不会被合并,除非你把WIP:删除。

5.什么时候使用 git stash

git push -u origin master

发现有一个类是多余的,想删掉它又担心以后需要查看它的代码,想保存它但又不想增加一个脏的提交。这时就可以考虑git stash。

  1. 从远程仓库克隆

6.如何使用 git 命令

对任何命令使用--help选项,例如,git stash --help。

$ git clone git@github.com:lanbin/learngit.gitCloning into 'gitskills'...remote: Counting objects: 3, done.remote: Total 3 , reused 0 , pack-reused 3Receiving objects: 100% , done.
  1. 什么是“ git flow”?

Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。

Git Flow 定义了一个项目发布的分支模型,为管理具有预定发布周期的大型项目提供了一个健壮的框架,是由 Vincent Driessen 提出的一个 git 操作流程标准、解决当分支过多时 , 如何有效快速管理这些分支。

HEAD指向的就是当前分支

8.什么是 GitHub flow ?

  1. git checkout命令加上-b参数表示创建并切换

GitHub flow,顾名思义,就是 GitHub 所推崇的 Workflow。(千万不要理解成 GitHub 上才能用的 Workflow), 基本上,GitHub Flow 是master/feature分支工作流程的品牌名称。

GitHub flow 的核心优势在于其流程带来的自动化可能性,能够做到其它流程无法实现的检查过程,并极大简化开发团队的体力劳动,真正发挥自身的价值。

$ git checkout -b devSwitched to a new branch 'dev'

9.你更喜欢哪种分支策略?

  1. 用git branch命令查看当前分支

大多数 Git项目都是 “Git flow”。这些项目中只有少数需要这种策略,通常是因为它是版本化的软件。

master/feature分支策略更易于管理,尤其是在刚入门时,如果需要,切换到 “git flow” 非常容易。

$ git branch* dev maste
  1. git open 命令是做啥用的
  1. 切换回master分支

这是一个单独的命令,可以作为 npm 包使用。

11.当在其他分支中添加的文件仍然在工作分支中显示为未跟踪或修改时,如何重置分支

$ git checkout masterSwitched to branch 'master'

这通常是“工作索引”不干净时切换分支的结果。

  1. 把dev分支的工作成果合并到master分支上

在 git 中没有内置的方法来纠正这一点。通常通过确保提示符有一个 “status” 指示符并在每次更改分支时运行诸如git status之类的命令来避免这种情况。这些习惯会让咱们尽早发现这些问题,这样就可以在新的分支上stash或commit这些更改。

  1. 如何重命名分支?

    git branch -m current-branch-name new-branch-name

  2. 如何使用 cherry-pick

$ git merge devUpdating d46f35e..b17d20eFast-forward readme.txt | 1 + 1 file changed, 1 insertion

git cherry-pick [reference]请记住,这是一个重新应用的命令,因此它将更改提交 SHA。

  1. 合并完成后,就可以放心地删除dev分支了

14. 如果从一个分支恢复(例如HEAD~3),是否可以再次返回到HEAD(比如恢复上一次更新)

在这种情况下,通过运行git reset --hard HEAD~1立即撤消还原提交(即HEAD提交)。

$ git branch -d devDeleted branch dev (was b17d20e
  1. 什么时候使用git pull和git fetch?

Git鼓励大量使用分支:

git pull将下载提交到当前分支。记住,git pull实际上是fetch和merge命令的组合。

  1. 查看分支:git branch
  2. 创建分支:git branch <name>
  3. 切换分支:git checkout <name>
  4. 创建+切换分支:git checkout -b <name>
  5. 合并某分支到当前分支:git merge <name>
  6. 删除分支:git branch -d <name>

git fetch将从远程获取最新的引用。

  1. 如果存在冲突,将合并失败并有提示$ git merge feature1Auto-merging readme.txtCONFLICT : Merge conflict in readme.txtAutomatic merge failed; fix conflicts and then commit the result.

  2. git status也可以告诉我们冲突的文件

一个很好的类比是播客播放器或电子邮件客户端。咱们可能会检索最新的播客或电子邮件(fetch),但实际上尚未在本地下载播客或电子邮件附件(pull)。

  1. 为什么有时需要使用--force来强制提交更改
$ git statusOn branch masterYour branch is ahead of 'origin/master' by 2 commits. (use "git push" to publish your local commits)You have unmerged paths. (fix conflicts and run "git commit") (use "git merge --abort" to abort the merge)Unmerged paths: (use "git add <file>..." to mark resolution) both modified: readme.txtno changes added to commit (use "git add" and/or "git commit -a")

rebase是一个可以重新提交的命令,它改变了SHA1hash。如果是这样,本地提交历史将不再与其远程分支保持一致。

可以直接查看readme.txt的内容

当这种情况发生时,push会被拒绝。只有在被拒绝时,才应该考虑使用git push --force。这样做将用本地提交历史覆盖远程提交历史。所以可以回过头来想想,想想为什么要使用--force。

Git is a distributed version control system.Git is free software distributed under the GPL.Git has a mutable index called stage.Git tracks changes of files.<<<<<<< HEADCreating a new branch is quick & simple.=======Creating a new branch is quick AND simple.>>>>>>> feature1
  1. 可以使用分支合并多个分支,然后将该分支发送给master吗?
  1. 修改后再提交,然后用带参数的git log也可以看到分支的合并情况

当然可以,在大多数 git 工作流下,分支通常会累积来自多个其他分支的更改,最终这些分支会被合并到主分支。

  1. 应该从一个非常老的分支做一个rebase吗?
$ git log --graph --pretty=oneline --abbrev-commit* cf810e4 (HEAD -> master) conflict fixed| | * 14096d0  AND simple* | 5dc6824 & simple|/ * b17d20e branch test* d46f35e (origin/master) remove test.txt* b84166e add test.txt* 519219b git tracks changes* e43a48b understand how stage works* 1094adb append GPL* e475afc add distributed* eaadf4e wrote a readme file

除非是迫不得已。

  1. git log --graph命令可以看到分支合并图。
  2. 当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成
  3. 解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。

根据你的工作流,可以将旧的分支合并到主分支中。

如果你需要一个最新的分支,我更喜欢rebase。它只提供更改且更清晰的历史记录,而不是来自其他分支或合并的提交。

  1. master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
  2. dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
  3. 开发者都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

然而,尽管总是可能的,但是使用rebase可能是一个痛苦的过程,因为每次提交都要重新应用。这可能会导致多重冲突。如果是这样,我通常使用rebase --abort并使用merge来一次性解决所有冲突。

所以,团队合作的分支看起来就像这样:

  1. 使用rebase -i时,squash和fixup有什么区别

10bet 4image

squash和 fixup 结合两个提交。squash暂停rebase进程,并允许咱们调整提交的消息。fixup自动使用来自第一次提交的消息。

修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;当手头工作没有完成时,先把工作现场git stash,然后去修复bug,修复后,再git stash pop,回到工作现场。

  1. 通常,当使用master重新建立功能分支时,对于每次提交都需要解决冲突?
  1. git stash命令把工作现场“储藏”起来

是的。由于每次提交的更改都会在rebase期间重新应用,所以必须在冲突发生时解决它们。

这意味着在提交之前就已经有了提交冲突,如果没有正确地解决它,那么下面的许多提交也可能发生冲突。为了限制这一点,我经常使用rebase -i来压缩提交历史记录,以便更轻松地使用它。

$ git stashSaved working directory and index state WIP on dev: f52c633 add merge

如果许多提交之间仍然存在冲突,可以使用merge。

  1. git stash list命令看看储存清单

21.在与 master 合并之前,有必要更新我的分支吗

根据你的工作流,可以将旧的分支合并到主分支中。如果你的工作流仅使用 "fast-forward"合并,那么有必要在合并之前更新你的分支。

$ git stash liststash@{0}: WIP on dev: f52c633 add merge

Git fast forward 提交

  1. 用git stash apply从储存恢复到工作现场,恢复后stash内容并不删除

  2. 用git stash drop命令来删除储存

  3. git stash pop = git stash apply + git stash drop

多人协同开发,使用 Git 经常会看到警告信息包含术语:fast forward, 这是何义?

简单来说就是提交到远程中心仓库的代码必须是按照时间顺序的。

  1. 开发一个新实验功能,最好新建一个分支;
  2. 如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除;

比如A从中心仓库拿到代码后,对文件f进行了修改。然后push到中心仓库。

B在A之前就拿到了中心仓库的代码,在A push成功之后也对f文件进行了修改。这个时候B也运行push命令推送代码。

  1. 查看远程库信息,使用git remote -v;

  2. 本地新建的分支如果不推送到远程,对其他人就是不可见的;

  3. 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;

  4. 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;

  5. 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;

  6. 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。

会收到一个类似下面的信息:

哪些分支需要推送,哪些不需要呢?

  1. master分支是主分支,因此要时刻与远程同步;
  2. dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
  3. bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
  4. feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。

10bet 5image10bet 6image10bet 7image

在rebase的过程中,也许会出现冲突. 在这种情况,Git会停止rebase并会让你去解决 冲突;在解决完冲突后,用"git-add"命令去更新这些内容的索引, 然后,你无需执行 git-commit,只要执行:

$ git rebase --continue

这样git会继续应用余下的补丁。

在任何时候,你可以用--abort参数来终止rebase的行动,并且"mywork" 分支会回到rebase开始前的状态

$ git rebase --abort
  1. 命令git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id;
  2. 命令git tag -a <tagname> -m "blablabla..."可以指定标签信息;
  3. 命令git tag可以查看所有标签。
  4. 命令git show <tagname>查看标签信息
  5. 命令git push origin <tagname>可以推送一个本地标签;
  6. 命令git push origin --tags可以推送全部未推送过的本地标签;
  7. 命令git tag -d <tagname>可以删除一个本地标签;
  8. 命令git push origin :refs/tags/<tagname>可以删除一个远程标签。
  1. 在GitHub上,可以任意Fork开源仓库eg. https://github.com/twbs/bootstrap
  2. 自己拥有Fork后的仓库的读写权限;点“Fork”就在自己的账号下克隆了一个bootstrap仓库,然后从自己的账号下clone
git clone git@github.com:lanbin/bootstrap.git
  1. 可以推送pull request给官方仓库来贡献代码。对方是否接受你的pull request就不一定了

廖雪峰Git教程-使用码云

  1. 忽略某些文件时,需要编写.gitignore;
  2. .gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理
  1. 廖雪峰Git教程
  2. Git Community Book 中文版
chenshu@sloop2:~/work/189/appengine$ git pushTo ssh://csfreebird@10.112.18.189:29418/appengine.git! [rejected]master - master (non-fast-forward)error: failed to push some refs to 'ssh://csfreebird@10.112.18.189:29418/appengine.git'To prevent you from losing history, non-fast-forward updates were rejectedMerge the remote changes (e.g. 'git pull') before pushing again. See the'Note about fast-forwards' section of 'git push --help' for details.

提醒你非快进方式的更新被拒绝了,需要先从中心仓库pull到最新版本,merge后再push.

fast forward能够保证不会强制覆盖别人的代码,确保了多人协同开发。尽量不要使用non fast forward方法提交代码。

  1. 需要使用 GitKraken 这种可视化工具吗

本文由10bet发布于Web前端,转载请注明出处:GIT学习笔记10bet

关键词:

最火资讯