Git从安装到大师,最全的使用攻略(二)

简介: Git从安装到大师,最全的使用攻略(二)

未暂存(Unstaged)的内容

我想把未暂存的内容移动到一个新分支

$ git checkout -b my-branch


我想把未暂存的内容移动到另一个已存在的分支

$ git stash

$ git checkout my-branch

$ git stash pop


我想丢弃本地未提交的变化(uncommitted changes)

如果你只是想重置源(origin)和你本地(local)之间的一些提交(commit),你可以:

# one commit

(my-branch)$ git reset --hard HEAD^

# two commits

(my-branch)$ git reset --hard HEAD^^

# four commits

(my-branch)$ git reset --hard HEAD~4

# or

(main)$ git checkout -f

重置某个特殊的文件, 你可以用文件名做为参数:

$ git reset filename


我想丢弃某些未暂存的内容

如果你想丢弃工作拷贝中的一部分内容,而不是全部。

签出(checkout)不需要的内容,保留需要的。

$ git checkout -p

# Answer y to all of the snippets you want to drop

另外一个方法是使用 stash, Stash所有要保留下的内容, 重置工作拷贝, 重新应用保留的部分。

$ git stash -p

# Select all of the snippets you want to save

$ git reset --hard

$ git stash pop

或者, stash 你不需要的部分, 然后stash drop。

$ git stash -p

# Select all of the snippets you don't want to save

$ git stash drop

分支(Branches)

我从错误的分支拉取了内容,或把内容拉取到了错误的分支

这是另外一种使用 git reflog 情况,找到在这次错误拉(pull) 之前HEAD的指向。

(main)$ git reflog

ab7555f HEAD@{0}: pull origin wrong-branch: Fast-forward

c5bc55a HEAD@{1}: checkout: checkout message goes here

重置分支到你所需的提交(desired commit):

$ git reset --hard c5bc55a

完成。

我想扔掉本地的提交(commit),以便我的分支与远程的保持一致

先确认你没有推(push)你的内容到远程。

git status 会显示你领先(ahead)源(origin)多少个提交:

(my-branch)$ git status

# On branch my-branch

# Your branch is ahead of 'origin/my-branch' by 2 commits.

#   (use "git push" to publish your local commits)

#

一种方法是:

(main)$ git reset --hard origin/my-branch

我需要提交到一个新分支,但错误的提交到了main

在main下创建一个新分支,不切换到新分支,仍在main下:

(main)$ git branch my-branch

把main分支重置到前一个提交:

(main)$ git reset --hard HEAD^

HEAD^HEAD^1 的简写,你可以通过指定要设置的HEAD来进一步重置。

或者, 如果你不想使用 HEAD^, 找到你想重置到的提交(commit)的hash(git log 能够完成), 然后重置到这个hash。 使用git push 同步内容到远程。

例如, main分支想重置到的提交的hash为a13b85e:

(main)$ git reset --hard a13b85e

HEAD is now at a13b85e

签出(checkout)刚才新建的分支继续工作:

(main)$ git checkout my-branch

我想保留来自另外一个ref-ish的整个文件

假设你正在做一个原型方案(原文为working spike (see note)), 有成百的内容,每个都工作得很好。现在, 你提交到了一个分支,保存工作内容:

(solution)$ git add -A && git commit -m "Adding all changes from this spike into one big commit."

当你想要把它放到一个分支里 (可能是feature, 或者 develop), 你关心是保持整个文件的完整,你想要一个大的提交分隔成比较小。

假设你有:

  • 分支 solution, 拥有原型方案, 领先 develop 分支。
  • 分支 develop, 在这里你应用原型方案的一些内容。

我去可以通过把内容拿到你的分支里,来解决这个问题:

(develop)$ git checkout solution -- file1.txt

这会把这个文件内容从分支 solution 拿到分支 develop 里来:

# On branch develop

# Your branch is up-to-date with 'origin/develop'.

# Changes to be committed:

#  (use "git reset HEAD <file>..." to unstage)

#

#        modified:   file1.txt

然后, 正常提交。

Note: Spike solutions are made to analyze or solve the problem. These solutions are used for estimation and discarded once everyone gets clear visualization of the problem. ~ Wikipedia.

我把几个提交(commit)提交到了同一个分支,而这些提交应该分布在不同的分支里

假设你有一个main分支, 执行git log, 你看到你做过两次提交:

(main)$ git log


commit e3851e817c451cc36f2e6f3049db528415e3c114

Author: Alex Lee <alexlee@example.com>

Date:   Tue Jul 22 15:39:27 2014 -0400


   Bug #21 - Added CSRF protection


commit 5ea51731d150f7ddc4a365437931cd8be3bf3131

Author: Alex Lee <alexlee@example.com>

Date:   Tue Jul 22 15:39:12 2014 -0400


   Bug #14 - Fixed spacing on title


commit a13b85e984171c6e2a1729bb061994525f626d14

Author: Aki Rose <akirose@example.com>

Date:   Tue Jul 21 01:12:48 2014 -0400


   First commit

让我们用提交hash(commit hash)标记bug (e3851e8 for #21, 5ea5173 for #14).

首先, 我们把main分支重置到正确的提交(a13b85e):

(main)$ git reset --hard a13b85e

HEAD is now at a13b85e

现在, 我们对 bug #21 创建一个新的分支:

(main)$ git checkout -b 21

(21)$

接着, 我们用 cherry-pick 把对bug #21的提交放入当前分支。 这意味着我们将应用(apply)这个提交(commit),仅仅这一个提交(commit),直接在HEAD上面。

(21)$ git cherry-pick e3851e8

这时候, 这里可能会产生冲突, 参见交互式 rebasing 章冲突节 解决冲突.

再者, 我们为bug #14 创建一个新的分支, 也基于main分支

(21)$ git checkout main

(main)$ git checkout -b 14

(14)$

最后, 为 bug #14 执行 cherry-pick:

(14)$ git cherry-pick 5ea5173

我想删除上游(upstream)分支被删除了的本地分支

一旦你在github 上面合并(merge)了一个pull request, 你就可以删除你fork里被合并的分支。 如果你不准备继续在这个分支里工作, 删除这个分支的本地拷贝会更干净,使你不会陷入工作分支和一堆陈旧分支的混乱之中。

$ git fetch -p

我不小心删除了我的分支

如果你定期推送到远程, 多数情况下应该是安全的,但有些时候还是可能删除了还没有推到远程的分支。 让我们先创建一个分支和一个新的文件:

(main)$ git checkout -b my-branch

(my-branch)$ git branch

(my-branch)$ touch foo.txt

(my-branch)$ ls

README.md foo.txt

添加文件并做一次提交

(my-branch)$ git add .

(my-branch)$ git commit -m 'foo.txt added'

(my-branch)$ foo.txt added

1 files changed, 1 insertions(+)

create mode 100644 foo.txt

(my-branch)$ git log


commit 4e3cd85a670ced7cc17a2b5d8d3d809ac88d5012

Author: siemiatj <siemiatj@example.com>

Date:   Wed Jul 30 00:34:10 2014 +0200


   foo.txt added


commit 69204cdf0acbab201619d95ad8295928e7f411d5

Author: Kate Hudson <katehudson@example.com>

Date:   Tue Jul 29 13:14:46 2014 -0400


   Fixes #6: Force pushing after amending commits

现在我们切回到主(main)分支,‘不小心的’删除my-branch分支

(my-branch)$ git checkout main

Switched to branch 'main'

Your branch is up-to-date with 'origin/main'.

(main)$ git branch -D my-branch

Deleted branch my-branch (was 4e3cd85).

(main)$ echo oh noes, deleted my branch!

oh noes, deleted my branch!

在这时候你应该想起了reflog, 一个升级版的日志,它存储了仓库(repo)里面所有动作的历史。

1. (main)$ git reflog
2. 69204cd HEAD@{0}: checkout: moving from my-branch to main
3. 4e3cd85 HEAD@{1}: commit: foo.txt added
4. 69204cd HEAD@{2}: checkout: moving from main to my-branch

正如你所见,我们有一个来自删除分支的提交hash(commit hash),接下来看看是否能恢复删除了的分支。

(main)$ git checkout -b my-branch-help

Switched to a new branch 'my-branch-help'

(my-branch-help)$ git reset --hard 4e3cd85

HEAD is now at 4e3cd85 foo.txt added

(my-branch-help)$ ls

README.md foo.txt

看! 我们把删除的文件找回来了。 Git的 reflog 在rebasing出错的时候也是同样有用的。

我想删除一个分支

删除一个远程分支:

(main)$ git push origin --delete my-branch

你也可以:

(main)$ git push origin :my-branch

删除一个本地分支:

(main)$ git branch -D my-branch

我想从别人正在工作的远程分支签出(checkout)一个分支

首先, 从远程拉取(fetch) 所有分支:

(main)$ git fetch --all

假设你想要从远程的daves分支签出到本地的daves

(main)$ git checkout --track origin/daves

Branch daves set up to track remote branch daves from origin.

Switched to a new branch 'daves'

(--trackgit checkout -b [branch] [remotename]/[branch] 的简写)

这样就得到了一个daves分支的本地拷贝, 任何推过(pushed)的更新,远程都能看到.

相关文章
|
1天前
|
Linux Shell 网络安全
Git的安装以及SSH配置
Git的安装以及SSH配置
9 0
|
3天前
|
Ubuntu Linux 网络安全
|
1月前
|
存储 JavaScript 开发工具
Windows 10环境下Git安装之简易指南
该指南教小白在Windows 10上安装Git,介绍Git设置的基础知识,为你的开发项目做准备!
|
3月前
|
Linux Shell 开发工具
git的安装
git的安装
39 0
|
4月前
|
编译器 定位技术 开发工具
分布式版本控制系统Git的下载、安装与使用其复制GitHub项目代码的方法
分布式版本控制系统Git的下载、安装与使用其复制GitHub项目代码的方法
|
4月前
|
Shell 网络安全 开发工具
Git下载安装及基本配置
Git下载安装及基本配置
106 0
|
4月前
|
开发工具 git
hbuilderX安装git插件→拉取线上gitlab项目
hbuilderX安装git插件→拉取线上gitlab项目
|
4月前
|
Shell 网络安全 开发工具
[分布式] Git详细安装与配置
[分布式] Git详细安装与配置
289 0
|
4月前
|
存储 Linux 网络安全
Git - Centos7下安装GitLab服务器
Git - Centos7下安装GitLab服务器
99 1
|
4月前
|
存储 安全 开发工具
快速入门安装及使用&git与svn的区别&常用命令
快速入门安装及使用&git与svn的区别&常用命令
107 0

相关实验场景

更多