抛弃GUI,在Linux下,使用命令行才是王道。 |
---|
ssh-keygen -t rsa -C "your@email.com"
- -t Type 指的是加密算法的类型,后面跟得是rsa
- -C comment 注释,一般是使用你的邮箱地址
git config --global user.name "用户名"
git config --global user.email "邮箱"
git config --global core.quotepath false
git add (filename)
git rm (filename)
分别对应添加和删除文件.(filaname)为对应的文件名称。也可以使用
git add .
添加全部修改或新增的文件
git commit -m "the first commit"
提交文件,后面的字符串就是commit的标题
单引号,双引号都可以
linux中直接使用git commit
会出现nano。nano写commit的提示信息很不方便。貌似一定要要保存个文件名什么的,用着也不如vim顺手。
设置
git config --global core.editor vim
如果你在与Git的默认设置背道而驰,先问问为什么。 将公共分支历史看做不可变的、原子性的、容易追溯的。将私有分支历史看做一次性的、可编辑的。 推荐的工作流程是:
- 基于公共分支创建一个私有分支。
- 经常向这个私有分支commit代码。
- 一旦你的代码完善了,就清理掉私有分支的历史。
- 将干净的私有分支merge到公共分支中。
操作 | 详细命令 |
---|---|
新建分支 | git branch testing |
切换分支 | git checkout testing |
删除分支 | git branch -d testing |
查看分支 | git branch |
我今天遇到的一个状况就是:我是在网站上新建的分支alpha,然后本地的代码又进行了改动,本来想把改动都push进alpha的。结果在本地是无法checkout的。因为本地还没有这个分支,这时候git stash就派上用场了。
- git stash
- git pull
- git checkout alpha
- git stash apply
- git push
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 【新分支名】
原来误以为这个操作是
git branch -b 【新分支名】
,囧。。
通常我们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 pull
和git 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 -u
可以自动track删除掉的文件
git add -A
可以自动track删除掉和新增的文件
原先一直是clone项目的。但是也可以把本地项目变作git项目。只需要
git init
但是还有和远端建立连接
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,我需要把他的更新也同步到我的这个库里面。
其实没有用到新的知识,都是已经掌握的。主要是学到了一个经验。
- 增加一个远端
git remote add ma6174 https://github.com/ma6174/vim.git
远端名任意。
- 开始更新
git fetch ma6174
- 合并
git merge ma6174/master
或者直接git pull ma6174 master
再git push ncu master
其中ncu是添加的另一个远端
commit的a
选项,只能捕获修改和删除的文件。
git add .只能添加当前目录及其子目录下新增或修改的文件, 不能添加兄弟目录下的文件。
这个命令一定要加路径才行。要添加该目录树下所有新文件
git add -A :/
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
了,而不用指定远端和分支。
使用SSH协议可以避免每次push
输入密码。前提是在账户里配置好SSH秘钥。
git@github.com开头的就是SSH协议。
使用Https协议则会导致每次都会输入用户名和密码。
2014/08/31
git config --global credential.helper store
查看man手册的git命令时,比如查询git diff要使用man git-diff。
可以显示在Git管理范围内的文件。
比较差别。但是只能显示已经在Git范围内的文件,新建而未添加的文件不显示差别。
注意,git diff显示的是“缓存区”(staging area)和工作区之间的差别。
也就是说,当我把改动的文件add之后,缓存区与工作区就一致了,使用git diff就会没有反应。
用以显示最新提交(commit)和当前工作区的差别。包括已更改但尚未add的改动。
暂存,就是已经add但未commit的文件。
git reset HEAD
恢复所有add文件为未暂存的状态。 也可以使用上面语句加上单个文件名,来恢复单个文件。
先用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
一个错误的解决方案:
今天在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
如果你的工作区发生了改动,还没暂存的话,
那么用git status
查看,改动的文件会是红色的。此时如果执行git pull
,
则会出现问题,提示你要暂存改动,如果你不想暂存,想用云端的文件覆盖掉本地的文件,
则需要丢弃工作区改动:
git checkout 要丢弃改动的文件名
git checkout ddl.sql
git push -u origin 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才能生效。 企业内部为了规范代码的提交,常常使用
在工作中,多人合作开发一个项目的时候,难免存在其他人更新了master代码的情况。这时候如果直接git pull
则会自动产生一个merge记录,在git log里。通常merge log是不友好的,会给代码回溯,代码review带来一些麻烦。企业内部一般鼓励保持git log时间线的线性,所谓线性就是不含有merge记录。应该在pull代码的时候进行如下操作:
要使用git pull --rebase
代替git pull
,这个操作称之为『变基』。没冲突则自动成功,把你的commit调整到master最后一个commit之后。如果有冲突,此时会出现一个临时分支,并且会自动切到该分支下。像平常一样修改代码解决冲突,然后git add修改的文件,此时不要git commit --amend
。而是使用git rebase --continue
。则会回到master分支,并且将时间线调整成线性。
如果你已经误操作了git pull
,并且自动出现了merge记录也有补救措施,就是git reset --soft
软重置到你commit的时间点。然后重新执行git pull --rebase
,进行正确的操作,由于是软重置,本地代码改动未丢失,基本上不会再大量改动冲突文件,当然可能也会报冲突,不过打开文件,你会发现:<<<===
中间是空的,直接删除冲突标记行就可以。