继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

6年工作总结GIT常用命令

知小帆
关注TA
已关注
手记 43
粉丝 19
获赞 134
================================================git提交远程需要密码
1、首先在远程服务器生成sshkey:ssh-keygen
2、然后在目录~下面新建文件authorized_keys:
$ mkdir .ssh && chmod 700 .ssh
$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys


3、把第一步生成的id_rsa.pub里面的内容放到第二步生成的文件里面:cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys

4、如果有多个用户只需要在本地生成rsa之后,添加到服务器authorized_keys里面,再次提交就不再需要密码;



==================================================
1.新建本地分支  $ git branch testing
以上两条组合为一条:$ git checkout -b testing Switched to a new branch "testing"
3.删除分支 $ git branch -d o2onew

5.推送分支到远程:git push origin serverfix:serferfix
$ git push origin --delete serverfix
意思是“上传我本地的 serverfix 分支到远程仓库中去,仍旧称它为 serverfix 分支”

6.获取远程分支到本地并切换到新分支:git checkout -b [分支名] [远程名]/[分支名]
7.删除远程分支:$ git push origin :serverfix
		--git push [远程名] [本地分支]:[远程分支] 
		--PS:这里是把[本地分支]省略后提交


8.回退到上一个版本:git reset --hard HEAD~3(数字代表:后退几步)   后退后再回到当前:git push

	PS:必须注意,--hard 标记是 reset 命令唯一的危险用法,它也是 Git 会真正地销毁数据的仅有的几个操作之一。 其他任何形式的 reset 调用都可以轻松撤消,但是 --hard 选项不能,因为它强制覆盖了工作目录中的文件。 在这种特殊情况下,我们的 Git 数据库中的一个提交内还留有该文件的 v3 版本,我们可以通过 reflog 来找回它。但是若该文件还未提交,Git 仍会覆盖它从而导致无法恢复



运行 git checkout [branch] 与运行 git reset --hard [branch] 非常相似,它会更新所有三棵树使其看起来像 [branch],不过有两点重要的区别。

首先不同于 reset --hard,checkout 对工作目录是安全的,它会通过检查来确保不会将已更改的文件弄丢。 其实它还更聪明一些。它会在工作目录中先试着简单合并一下,这样所有_还未修改过的_文件都会被更新。 而 reset --hard 则会不做检查就全面地替换所有东西。

第二个重要的区别是如何更新 HEAD。 reset 会移动 HEAD 分支的指向,而 checkout 只会移动 HEAD 自身来指向另一个分支。

例如,假设我们有 master 和 develop 分支,它们分别指向不同的提交;我们现在在 develop 上(所以 HEAD 指向它)。 如果我们运行 git reset master,那么 develop 自身现在会和 master 指向同一个提交。 而如果我们运行 git checkout master 的话,develop 不会移动,HEAD 自身会移动。 现在 HEAD 将会指向 master。

所以,虽然在这两种情况下我们都移动 HEAD 使其指向了提交 A,但_做法_是非常不同的。 reset 会移动 HEAD 分支的指向,而 checkout 则移动 HEAD 自身。




9.git stash  //暂存修改工作区



10、查看所有本地和分支:git remote show origin
    清除远程没有本地有的分支:git remote prune origin



11、在本地删除远程已经删除的分支。:git pull -p




12、
git push --all origin
上面命令表示,将所有本地分支都推送到origin主机。




13、
git push不会推送标签(tag),除非使用--tags选项。

$ git push origin --tags





14、提交在一个分钟不在另一个分支中:
在 experiment 分支中而不在 master 分支中的提交:$ git log master..experiment





15、比如,你想查看所有被 refA 或 refB 包含的但是不被 refC 包含的提交,你可以输入下面中的任意一个命令:
$ git log refA refB ^refC
$ git log refA refB --not refC



16、如果你想看 master 或者 experiment 中包含的但不是两者共有的提交,你可以执行:
$ git log master...experiment


16这种情形下,log 命令的一个常用参数是 --left-right,它会显示每个提交到底处于哪一侧的分支。 这会让输出数据更加清晰:$ git log --left-right master...experiment



17、现在想要切换分支,但是还不想要提交之前的工作;所以储藏修改。 将新的储藏推送到栈上,运行:
 git stash 或 git stash save

要查看储藏的东西,可以使用: git stash list

如果想要应用其中一个更旧的储藏,可以通过名字指定它,像这样:git stash apply stash@{2}
如果不指定一个储藏,Git 认为指定的是最近的储藏:


Git 也会储藏任何创建的未跟踪文件:git stash -u



当你做了几个改动并只想提交其中的一部分,过一会儿再回来处理剩余改动时,这个功能会很有用:
stash save 命令的 --keep-index 选项, 它告诉 Git 不要储藏任何你通过 git add 命令已暂存的东西:$ git stash --keep-index





18、
使用`git clean -f -d`命令来移除工作目录中所有未追踪的文件以及空的子目录。 -f 意味着 强制 或 “确定移除”。

如果只是想要看看它会做什么,可以使用 -n 选项来运行命令,这意味着 “做一次演习然后告诉你 将要 移除什么”:
$ git clean -d -n




19、
例如,如果我们想找到 ZLIB_BUF_MAX 常量是什么时候引入的,我们可以使用 -S 选项来显示新增和删除该字符串的提交:
$ git log -SZLIB_BUF_MAX --oneline




20、
例如,假设我们想查看 zlib.c 文件中`git_deflate_bound` 函数的每一次变更,我们可以执行:
git log -L :git_deflate_bound:zlib.c
Git 会尝试找出这个函数的范围,然后查找历史记录,并且显示从函数创建之后一系列变更对应的补丁





21、
你可能不想处理冲突这种情况,完全可以通过 git merge --abort 来简单地退出合并:$ git merge --abort

git merge --abort 选项会尝试恢复到你运行合并前的状态。 但当运行命令前,在工作目录中有未储藏、未提交的修改时它不能完美处理,除此之外它都工作地很好



22、合并冲突是因为空白造成的时候的解决办法:
如果你看到在一次合并中有大量的空白问题,你可以简单地中止它并重做一次,这次使用 -Xignore-all-space 或 -Xignore-space-change 选项。 第一个选项忽略任意 数量 的已有空白的修改,第二个选项忽略所有空白修改。

$ git merge -Xignore-space-change whitespace
PS:whitespace为分支




23、
要在合并前比较结果与在你的分支上的内容,换一句话说,看看合并引入了什么,可以运行:git diff --ours

如果我们想要查看合并的结果与他们那边有什么不同,可以运行:git diff --theirs -b	
PS:-b 来去除空白


24、
已经merge合并提交之后,可撤销,操作:$ git revert -m 1 HEAD






=================================================================
git pull报“unable to update local ref”解决方案
使用git pull拉取代码的时候,无法拉取最新代码,报"unable to update local ref"错误。

除了重新clone一份代码外,还可以使用如下解决方案:

1、切换到之前clone代码目录下,执行命令git gc --prune=now

2、再执行命令git remote prune origin

3、再次使用git pull








==========================================================更新子模块
git submodule update --remote --merge








=============================================================
使用git pull或者git push每次都需要输入用户名和密码很不人性化,耽误时间,现在教大家一条命令实现保存用户名和密码不用再输入

git config --global credential.helper store





=======================================git修改撤销的4中状态
已修改,未暂存	git checkout 或者  git reset --hard

已暂存,未提交  git reset git checkout  或者  git reset --hard

已提交,未推送   git reset --hard origin/master

已推送  

很不幸,你的手实在是太快了,你既git add了,又git commit了,并且还git push了,这时你的代码已经进入远程仓库。如果你想恢复的话,还好,由于你的本地仓库和远程仓库是等价的,你只需要先恢复本地仓库,再强制push到远程仓库就好了:
执行一下两条命令:
git reset --hard HEAD^
git push -f



=====================配置本地能用git==============
生成git密钥:ssh-keygen -t rsa -C "*********@q.com"



===================================================
Git 有三种状态,你的文件可能处于其中之一:已提交(committed)、已修改(modified)和已暂存(staged)。

基本的 Git 工作流程如下:

=>在工作目录中修改文件。

=>暂存文件,将文件的快照放入暂存区域。

=>提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。

====================================================
命令行
使用 Git 来获取 Git 的升级:
 $ git clone git://git.kernel.org/pub/scm/git/git.git


===================================================


初次运行 Git 前的配置
Git 自带一个 git config 的工具来帮助设置控制 Git 外观和行为的配置变量。 这些变量存储在三个不同的位置:

/etc/gitconfig 文件: 包含系统上每一个用户及他们仓库的通用配置。 如果使用带有 --system 选项的 git config 时,它会从此文件读写配置变量。

~/.gitconfig 或 ~/.config/git/config 文件:只针对当前用户。 可以传递 --global 选项让 Git 读写此文件。

当前使用仓库的 Git 目录中的 config 文件(就是 .git/config):针对该仓库。



用户信息:设置你的用户名称与邮件地址
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com


文本编辑器:Emacs
$ git config --global core.editor emacs


检查配置信息
git config --list 命令来列出所有 Git 当时能找到的配置


你可以通过输入 git config <key>: 来检查 Git 的某一项配置
$ git config user.name



===============================================
1.7 起步 - 获取帮助

获取帮助
若你使用 Git 时需要获取帮助,有三种方法可以找到 Git 命令的使用手册:
$ git help <verb>
$ git <verb> --help
$ man git-<verb>


获得 config 命令的手册:
$ git help config

===============================================
2.1 Git 基础 - 获取 Git 仓库

获取 Git 仓库


----在现有目录中初始化仓库


使用 Git 来对现有的项目进行管理,只需要进入该项目目录并输入:
$ git init



在一个已经存在文件的文件夹(而不是空文件夹)中初始化 Git 仓库来进行版本控制,可通过 git add 命令来实现对指定文件的跟踪,然后执行

git commit 提交$ git add *.c
$ git add LICENSE
$ git commit -m 'initial project version':




----克隆现有的仓库


克隆仓库的命令格式是 git clone [url] 。
比如,要克隆 Git 的可链接库 libgit2,可以用下面的命令:
$ git clone https://github.com/libgit2/libgit2



如果你想在克隆远程仓库的时候,自定义本地仓库的名字,你可以使用如下命令:
$ git clone https://github.com/libgit2/libgit2 mylibgit

=======================================================
2.2 Git 基础 - 记录每次更新到仓库

记录每次更新到仓库
初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态。








------状态简览

使用 git status -s 命令或 git status --short 命令,你将得到一种更为紧凑的格式输出。 运行 git status -s ,状态报告输出如下:
$ git status -s
 M README
MM Rakefile
A  lib/git.rb
M  lib/simplegit.rb
?? LICENSE.txt

PS:新添加的未跟踪文件前面有 ?? 标记,新添加到暂存区中的文件前面有 A 标记,修改过的文件前面有 M 标记。 你可能注意到了 M 有两个可以出现的位置,出现在右边的 M 表示该文件被修改了但是还没放入暂存区,出现在靠左边的 M 表示该文件被修改了并放入了暂存区。 例如,上面的状态报告显示: README 文件在工作区被修改了但是还没有将修改后的文件放入暂存区,lib/simplegit.rb 文件被修改了并将修改后的文件放入了暂存区。 而 Rakefile 在工作区被修改并提交到暂存区后又在工作区中被修改了,所以在暂存区和工作区都有该文件被修改了的记录。




------忽略文件

可以创建一个名为 .gitignore 的文件,列出要忽略的文件模式。 来看一个实际的例子:
$ cat .gitignore
*.[oa]
*~

PS:第一行告诉 Git 忽略所有以 .o 或 .a 结尾的文件。一般这类对象文件和存档文件都是编译过程中出现的。 第二行告诉 Git 忽略所有以波浪符(~)结尾的文件,许多文本编辑软件(比如 Emacs)都用这样的文件名保存副本。 此外,你可能还需要忽略 log,tmp 或者 pid 目录,以及自动生成的文档等等。 要养成一开始就设置好 .gitignore 文件的习惯,以免将来误提交这类无用的文件。





------查看已暂存和未暂存的修改

你想知道具体修改了什么地方,可以用 git diff 命令。 

要查看尚未暂存的文件更新了哪些部分,不加参数直接输入 git diff:
$ git diff
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 8ebb991..643e24f 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -65,7 +65,8 @@ branch directly, things can get messy.
 Please include a nice description of your changes when you submit your PR;
 if we have to read the whole diff to figure out why you're contributing
 in the first place, you're less likely to get feedback and have your change
-merged in.
+merged in. Also, split your changes into comprehensive chunks if your patch is
+longer than a dozen lines.

 If you are starting to work on a particular area, feel free to submit a PR
 that highlights your work in progress (and note in the PR title that it's

PS:此命令比较的是工作目录中当前文件和暂存区域快照之间的差异, 也就是修改之后还没有暂存起来的变化内容。



若要查看已暂存的将要添加到下次提交里的内容,可以用 git diff --cached 命令:
$ git diff --staged
diff --git a/README b/README
new file mode 100644
index 0000000..03902a1
--- /dev/null
+++ b/README
@@ -0,0 +1 @@
+My Project
请注意,git diff 本身只显示尚未暂存的改动,而不是自上次提交以来所做的所有改动

运行 git diff 看暂存前后的变化:

用 git diff --cached 查看已经暂存起来的变化:





------跳过使用暂存区域

只要在提交的时候,给 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤:

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   CONTRIBUTING.md

no changes added to commit (use "git add" and/or "git commit -a")
$ git commit -a -m 'added new benchmarks'
[master 83e38c7] added new benchmarks
 1 file changed, 5 insertions(+), 0 deletions(-)
看到了吗?提交之前不再需要 git add 文件“CONTRIBUTING.md”了




------移除文件

要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。 可以用 git rm 命令完成此项工作,并连带从工作目录中删除指定的文件,这样以后就不会出现在未跟踪文件清单中了。

如果只是简单地从工作目录中手工删除文件,运行 git status 时就会在 “Changes not staged for commit” 部分(也就是 未暂存清单)看到:
$ rm PROJECTS.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        deleted:    PROJECTS.md

no changes added to commit (use "git add" and/or "git commit -a")
然后再运行 git rm 记录此次移除文件的操作:

$ git rm PROJECTS.md
rm 'PROJECTS.md'
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    deleted:    PROJECTS.md


你想让文件保留在磁盘,但是并不想让 Git 继续跟踪。 当你忘记添加 .gitignore 文件,不小心把一个很大的日志文件或一堆 .a 这样的编译生成文件添加到暂存区时,这一做法尤其有用。 为达到这一目的,使用 --cached 选项:
$ git rm --cached README
git rm 命令后面可以列出文件或者目录的名字,也可以使用 glob 模式。 比方说:

$ git rm log/\*.log
注意到星号 * 之前的反斜杠 \, 因为 Git 有它自己的文件模式扩展匹配方式,所以我们不用 shell 来帮忙展开。 此命令删除 log/ 目录下扩展名为 .log 的所有文件。 类似的比如:

$ git rm \*~
该命令为删除以 ~ 结尾的所有文件。





------移动文件

要在 Git 中对文件改名,可以这么做:
$ git mv file_from file_to

其实,运行 git mv 就相当于运行了下面三条命令:
$ mv README.md README
$ git rm README.md
$ git add README

========================================================
2.3 Git 基础 - 查看提交历史



查看提交历史:git log 命令。
$ git log

一个常用的选项是 -p,用来显示每次提交的内容差异。 你也可以加上 -2 来仅显示最近两次提交:$ git log -p -2

如果你想看到每次提交的简略的统计信息,你可以使用 --stat 选项:
$ git log --stat

最有意思的是 format,可以定制要显示的记录格式:
$ git log --pretty=format:"%h - %an, %ar : %s"




Table 2-2. git log 的常用选项
选项	说明
-p	按补丁格式显示每个更新之间的差异。

--stat	显示每次更新的文件修改统计信息。

--shortstat	只显示 --stat 中最后的行数修改添加移除统计。

--name-only	仅在提交信息后显示已修改的文件清单。

--name-status	显示新增、修改、删除的文件清单。

--abbrev-commit	仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。

--relative-date	使用较短的相对时间显示(比如,“2 weeks ago”)。

--graph		显示 ASCII 图形表示的分支合并历史。

--pretty		使用其他格式显示历史提交信息。
可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)。


下面的命令列出所有最近两周内的提交:
$ git log --since=2.weeks



Table 2-3. 限制 git log 输出的选项
选项	说明
-(n)	仅显示最近的 n 条提交

--since, --after	仅显示指定时间之后的提交。

--until, --before	仅显示指定时间之前的提交。

--author		仅显示指定作者相关的提交。

--committer	仅显示指定提交者相关的提交。

--grep		仅显示含指定关键字的提交

-S		仅显示添加或移除了某个关键字的提交



========================================================
2.4 Git 基础 - 撤消操作



可以运行带有 --amend 选项的提交命令尝试重新提交:
$ git commit --amend
这个命令会将暂存区中的文件提交



------取消暂存的文件
使用 git reset HEAD <file>... 来取消暂存。 所以,我们可以这样来取消暂存 CONTRIBUTING.md 文件:
$ git reset HEAD CONTRIBUTING.md
Unstaged changes after reset:
M	CONTRIBUTING.md
$ git status



------撤消对文件的修改
$ git checkout -- CONTRIBUTING.md
$ git status


========================================================
2.6 Git 基础 - 打标签

------列出标签
$ git tag


------附注标签
最简单的方式是当你在运行 tag 命令时指定 -a 选项:
$ git tag -a v1.4 -m 'my version 1.4'
$ git tag
v0.1
v1.3
v1.4
-m 选项指定了一条将会存储在标签中的信息。 如果没有为附注标签指定一条信息,Git 会运行编辑器要求你输入信息。


------轻量标签
轻量标签,不需要使用 -a、-s 或 -m 选项,只需要提供标签名字:
$ git tag v1.4-lw
$ git tag
v0.1
v1.3
v1.4
v1.4-lw
v1.5


------共享标签
可以运行 git push origin [tagname]。
$ git push origin v1.5

也可以使用带有 --tags 选项的 git push 命令。 这将会把所有不在远程仓库服务器上的标签全部传送到那里
$ git push origin --tags



------检出标签
可以使用 git checkout -b [branchname] [tagname] 在特定的标签上创建一个新分支:

$ git checkout -b version2 v2.0.0
Switched to a new branch 'version2'


=============================================================
2.7 Git 基础 - Git 别名

通过 git config 文件来轻松地为每一个命令设置一个别名
$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status
这意味着,当要输入 git commit时,只需要输入 git ci。



=============================================================
运行 git log --oneline --decorate --graph --all ,它会输出你的提交历史、各个分支的指向以及项目的分支分叉情况。




====================================================================
3.3 Git 分支 - 分支管理


git branch 命令不只是可以创建与删除分支。 如果不加任何参数运行它,会得到当前所有分支的一个列表:
$ git branch
  iss53
* master
  testing
PS:* 字符:它代表现在检出的那一个分支(也就是说,当前 HEAD 指针所指向的分支).



如果需要查看每一个分支的最后一次提交,可以运行 git branch -v 命令:
$ git branch -v
  iss53   93b412c fix javascript issue
* master  7a98805 Merge branch 'iss53'
  testing 782fd34 add scott to the author list in the readmes

--merged 与 --no-merged 这两个有用的选项可以过滤这个列表中已经合并或尚未合并到当前分支的分支。 如果要查看哪些分支已经合并到当前分支,可以运行 git branch --merged:
$ git branch --merged
  iss53
* master


查看所有包含未合并工作的分支,可以运行 git branch --no-merged:
$ git branch --no-merged
  testing

这里显示了其他分支。 因为它包含了还未合并的工作,尝试使用 git branch -d 命令删除它时会失败:
可以使用:-D 选项强制删除它:$ git branch -D testing



=======================================================================
3.6 Git 分支 - 变基

------变基的风险
不要对在你的仓库外有副本的分支执行变基。


==========================================================================


打开App,阅读手记
12人推荐
发表评论
随时随地看视频慕课网APP