Git命令

抛弃GUI,在Linux下,使用命令行才是王道。

深入理解了几个git命令,入门级命令。

ssh

ssh-keygen -t rsa -C "your@email.com"
  • -t Type 指的是加密算法的类型,后面跟得是rsa
  • -C comment 注释,一般是使用你的邮箱地址

config

git config --global user.name "用户名"
git config --global user.email "邮箱"
git config --global core.quotepath false

git add or rm

    git add (filename)
    git rm (filename)

分别对应添加和删除文件.(filaname)为对应的文件名称。也可以使用

git add .

添加全部修改或新增的文件

commit

git commit -m "the first commit"

提交文件,后面的字符串就是commit的标题
单引号,双引号都可以

修改默认编辑器

linux中直接使用git commit会出现nano。nano写commit的提示信息很不方便。貌似一定要要保存个文件名什么的,用着也不如vim顺手。 设置

git config --global core.editor vim

git总结(来自网络)

如果你在与Git的默认设置背道而驰,先问问为什么。   将公共分支历史看做不可变的、原子性的、容易追溯的。将私有分支历史看做一次性的、可编辑的。 推荐的工作流程是:

  • 基于公共分支创建一个私有分支。
  • 经常向这个私有分支commit代码。
  • 一旦你的代码完善了,就清理掉私有分支的历史。
  • 将干净的私有分支merge到公共分支中。

分支

|操作|详细命令| |:—-:|:—–:| |新建分支|git branch testing| |切换分支|git checkout testing| |删除分支|git branch -d testing| |查看分支|git branch|

stash

我今天遇到的一个状况就是:我是在网站上新建的分支alpha,然后本地的代码又进行了改动,本来想把改动都push进alpha的。结果在本地是无法checkout的。因为本地还没有这个分支,这时候git stash就派上用场了。

  • git stash
  • git pull
  • git checkout alpha
  • git stash apply
  • git push

在git中添加文件的命令很简单git add .,但对于删除文件,一直有误解。今天算是搞清楚了git移除文件的命令奥义

git rm 文件名

git add不同。git add 并不会新建文件,只是把已经新建了的文件提交到本地仓库。但是git rm真的会删除文件。比如git rm a.c。如果a.c是已删除文件的话,那么就会提交到本地仓库,如果是未删除文件的话,就会给删除掉。

注意!可以这样被删除的只能是已经add过的文件,未在本地仓库记录的文件是无法删除的,要删除还是使用rm吧。

分支的小盲点

提交新分支

今天为操作系统实验,新建了个文件夹。又新建了个os分支用于在本地编辑实验文件。然后学到了提交本地新建分支到服务器。
在本地新建分支很容易

git branch 【分支名】 但是如何把分支提交到github呢? 开始我以为直接`git push`就行了,却发现不行。真正的做法是:

git push origin 【分支名】

新建并切换到新分支

git checkout -b 【新分支名】

把远端其他分支clone到本地

通常我们clone一个远端的仓库,只能克隆到它的master分支。然而如果有其他分支呢?比如github的gh-pages分支。

git branch gh-pages origin/gh-pages

很简单吧。以此类推,我们还能想出其他的解决方案。

git branch gh-pages
git checkout gh-pages origin/gh-pages 或者

git checkout -b gh-pages origin/gh-pages

注意,本地的那个分支并不一定要求和远端相联的分支名称相同。并且本地的分支并不一定要到远端,远端分支也并不一定需要到本地。

删除已提交到本地仓库的文件

我在本地新建了一个文件a.c,并使用git add a.c添加到本地暂存区,我现在想撤销它。

git rm --cache a.c

今天发了一个一直以来的误解吧:git pullgit push是针对所有分支进行的操作。也就是说即使我切换到一个次分支alpha, 如果这个分支和远端的分支已关联了的话,那么执行git pull会把master分支和alpha分支都更新到远端。 单独提交某个分支的方法,其实我前面的学习日志里已经写过了,汗颜。。。

git push origin alpha >`git pull`也是同样的道理。

移动文件

原先我移动文件到另一个文件夹总是使用shell的命令。

mv a.txt Book/ 这样有个问题就是接下来我要做两次track操作

git add .
git rm a.txt 但是,其实有个更简洁的操作,就是git的移动操作

git mv a.txt Book/ 不仅移动了文件的位置,而且自动track了这个变动。 ##  git add新学习

git add -u 可以自动track删除掉的文件

git add -A 可以自动track删除掉和新增的文件

git init

原先一直是clone项目的。但是也可以把本地项目变作git项目。只需要

git init ##  git remote 但是还有和远端建立连接

git remote add origin https://code.csdn.net/guodongxiaren/test.git 比如这样。origin这个远端名可以随便取,也可以删除掉它。

git remote rm origin 这样以后,如果pull的时候需要完整的路径。

git pull origin master 不能只写`git pull`了。

今天学到了使fork来的库与原ower的库保持更新的方法。因为我fork了一个vim配置文件的库, 原持有者修复了一些bug,我需要把他的更新也同步到我的这个库里面。

其实没有用到新的知识,都是已经掌握的。主要是学到了一个经验。

  1. 增加一个远端
     git remote add ma6174 https://github.com/ma6174/vim.git
    

    远端名任意。

  2. 开始更新
     git fetch ma6174
    
  3. 合并
     git merge ma6174/master
    

    或者直接git pull ma6174 master

git push ncu master

其中ncu是添加的另一个远端

git commit -a

commit的a选项,只能捕获修改和删除的文件。

对于git add .的再理解

git add .只能添加当前目录及其子目录下新增或修改的文件, 不能添加兄弟目录下的文件。

git add -A

这个命令一定要加路径才行。要添加该目录树下所有新文件

git add -A :/

克隆远端repository的时候,可以在后面加一个参数。如

git clone git@github.com:abc/hello.git hehe 这样这个repo的所在的文件夹名称就变为了hehe,而不是默认的hello了。 ##  删除远端的分支

git push origin --delete <分支名> 注意空格。即使是在子目录中也能添加整个目录树的文件。

设置默认追踪分支

git branch --set-upstream-to=origin/<branch> master 这样就可以直接`git pull`了,而不用指定远端和分支。 ##  git协议的误区 使用SSH协议可以避免每次`push`输入密码。前提是在账户里配置好SSH秘钥。 git@github.com开头的就是SSH协议。 使用Https协议则会导致每次都会输入用户名和密码。

git config --global credential.helper store https协议记住密码的命令。

查询man手册

查看man手册的git命令时,比如查询git diff要使用man git-diff。

git ls-files

可以显示在Git管理范围内的文件。

git diff

比较差别。但是只能显示已经在Git范围内的文件,新建而未添加的文件不显示差别。
注意,git diff显示的是“缓存区”(staging area)和工作区之间的差别。
也就是说,当我把改动的文件add之后,缓存区与工作区就一致了,使用git diff就会没有反应。

git diff HEAD

用以显示最新提交(commit)和当前工作区的差别。包括已更改但尚未add的改动。

git diff –cached

用以显示最新提交和缓存区的差别。包括已add但尚未commit的改动。

撤销暂存的文件

暂存,就是已经add但未commit的文件。

git reset HEAD 恢复所有add文件为未暂存的状态。 也可以使用上面语句加上单个文件名,来恢复单个文件。 ##  撤销commit的文件 先用git log查看每个版本的hash值   使用下面语句恢复到特定版本
   
git reset --hard hash值 hash值也可以用HEAD代替。     HEAD^代表上一次commit前的版本。      注意,这时已经暂存但未commit的文件,将消失。在上次版本之后出现的文件,也将消失。     HEAD^^代表上上次commit前的版本,以此类推。 ##  删除所有未被跟踪的文件
git clean -df

Git2.0版本,git add命令有了改动。使用如下命令进行设置:

git add --all 这样,以后被rm,mv操作的文件,再使用了git add .之后也能提交到暂存区了。

补充上次commit

git commit --amend 把文件添加到缓存区后,再执行上述命令。可以补充到上一次的commit。

一个错误的解决方案:
今天在CentOS上,git push的时候遇到一个问题:

error: The requested URL returned error: 403 Forbidden while accessing https://.... 我的remote地址使用的https协议。百度到的解决方案是:   把config文件中的url改为https://用户名@github.com/... 的形式。然后再push的时候就会直接提示输入密码。

设置本地分支默认跟踪的远程分支

git branch --set-upstream-to=origin/django django origin后面的django指的是远程分支,最后一个参数django是本地分支。

不再跟踪某一文件。

git rm [-r] --cached .classpath .classpath为文件名

丢弃工作区改动

如果你的工作区发生了改动,还没暂存的话, 那么用git status查看,改动的文件会是红色的。此时如果执行git pull, 则会出现问题,提示你要暂存改动,如果你不想暂存,想用云端的文件覆盖掉本地的文件, 则需要丢弃工作区改动:

git checkout 要丢弃改动的文件名
git checkout ddl.sql

把本地分支同步到remote

git push -u origin test 上面命令将当前本地分支,推送到远端的test分支,并建立关联。 远端若无test分支,则会自动创建

源码编译git。遇到了一些问题,主要是依赖没安装完整(也能编译成功,但是缺少功能)。

要安装的依赖是:

  • zlib
  • openssl(–shared和-fPIC选项)
  • libcurl(–with-ssl)
  • expat
  • ascilldoc

把这些源码下载下来编译好,就行了。
要注意的是openssl要先于libcurl编译,因为libcurl在configure阶段需要开启--with-ssl选项来指明openssl的路径,否则就无法支持很好地https协议(git pull失败)。

另外openssl的configure阶段要使用--shared -fPIC选项使编译生成动态库(.so,默认是静态库.a),这样才能被libcurl调用。如果之前已经生成过静态库了,重新编译之前要sudo make clean一下。

修改终端中git中文的显示方式:

git config --global core.quotepath false 这样就不会对`0x80`以上的字符进行quote。能正常显示中文。

修改默认push/pull规则。默认有两个规则:

  • Matching: 推送当前所有分支到remote
  • Simple: 只推送当前分支到remote

命令如下:

git config --global push.default matching
git config --global push.default simple

克隆指定分支的文件。

git clone -b 分支名 远端URL

孤儿分支,开启新历史

如果你想抛弃所有的git历史纪录,你可以创建一个孤儿分支,它不继承自任何父分支。而是重新开启一段git历史记录。 它不会丢失之前的文件,你只需要重新把它们commit一次。例如:

git checkout --orpha gh-pages

上述命令创建了一个分支gh-pages

如果原始分支master是空的,那么gh-pages分支创建后,master分支将消失。如果master不空,那么不消失。

删除远程分支

比如你想删除远程master分支。那么:

  • 本地删除master分支:git branch -D master
  • 在github上将其他分支(比如gh-pages)设置为默认分支
  • 本地执行git push -u origin :master(冒号前空格)

注意执行顺序。

git push origin HEAD:refs/for/master

这个命令会将代码推送到云端,但是不会直接在云端的master分支生效,表示需要经过code review才能生效。 企业内部为了规范代码的提交,常常使用

打赏一个呗

取消

失败是成功之母,鼓励是成功“支付”。

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦