lovecn / lovecn.github.io

个人记录
5 stars 5 forks source link

git记录 #30

Open lovecn opened 9 years ago

lovecn commented 9 years ago
git status -s
功能:用来比较,当前的工作目录和缓存区的状态
??:该文件还没有被git进行追踪
A:当前工作目录同缓存文件相比,新增加的文件
M:当前目录同缓冲区相比,已经进行了改变(Modify)
D: 当前目录同缓冲区相比,删除的文件

注意:git status 是以缓冲区中的内容为标准的,所有的AMD都是以缓冲区的内容为准,经过同缓冲区的对比,发现当前工作区进行了AMD等操作

git diff
功能:如果没有其他参数,git diff 会显示自从你上次提交快照之后尚未缓存的所有更改
注意:对比的参照点仍然是缓冲区中的内容,将当期那工作目录中的文件同缓冲区做对比

git diff --cached
功能:将缓冲区的内容同快照中的内容进行对比

git diff HEAD
功能:将当前工作目录中的文件,同快照中的内容进行对比

git commit -m '对本次提交的快照的说明'
功能:将缓冲区中的内容添形成一次快照(也就是打一个版本)

git commit -am '对本次提交的说明'
功能:同git commit -m 的功能类似,但是,由于多了一个a参数。这样就有一个隐含的操作,将已经追踪的文件先进行自动提交(注意:是已经追踪到的文件)!

git log :
功能:显示从最近到最远的提交日志
个人体会是,我们最想要的就是commmitid和对本次提交的说明

git reset --hard commitid
功能:回到指定的某个版本,注意,是连通当前的工作区一起回去,很可怕的一个命令。如果你并没有对当前的工作目录进行提交,而且还执行了这个操作,那么就杯具了,你上次提交后所有的更改内容就全部丢失而来,本人在这方面就犯了很大的错误!想想都是血泪啊!

git reflog
功能:用来记录你的每一次命令,这样我们就可以看到所有的commitid了(而git log只能够用来查看当前版本的commitid以及以前提交版本的commitid)

git checkout -- file
功能:将缓冲区或者快照中的指定文件恢复到当前的工作目录
注意:--是必须要写的,如果不写的话,就成为了分支的切换。
同时,我们应该明白,恢复的先后顺序。执行完改命令后,如果缓冲区中有该文件的话,那么工作目录就会恢复到缓冲区的样子!如果缓冲区没有文件的话,那么就会恢复到最新提交的版本上面!

git reset HEAD file
功能:将缓冲区中的指定文件,回退到最新的一次commit版本。
这个命令还是很有用的,如果我们误操作了,并且进行了add,那么此时再用 git checkout --file 恢复工作区中的内容的话,就没有任何效果了!但是执行git reset HEAD file这个命令,就可以将最新一次的commit中的file文件拉回到缓冲区中,然后在通过git checkout -- file命令,恢复到工作区中!

git branch
功能:展现当前的所有分支,前面带有 "*" 是所在分支

git branch 分支名
功能:创建一个新的分支

git checkout -b 分支名
功能:创建新分支,并切换到改分支上

git branch -d 分支名
功能:删除指定的分支(不可以删除当前所在分支)

git checkout 分支名
功能:用于在不同的分支之间进行切换
注意:由于版本的不同,在操作上可能有所不同!在某些版本上必须先进行git add , commit 之后,才能进行分支的切换!(1.8.3之前的貌似都需要提交才行),而有的分支则不需要进行此操作!

git merge 分支名
功能:将指定的分支合并到当前的分支
关于分支的合并我想说一下,自己的理解,个人认为所谓合并,其实是对所有修改的合并!这里举个例子说明会更好一些:
A作家写初步完成了一篇长篇小说的初稿,但是呢仍然需要对这篇长篇小说进行修修改改!处于对质量的严格要求!此时A作家找到了B作家,希望B作家提出宝贵的意见,让他对这篇小说也进行修改!等修改的差不多了,A作家,就让B作家把他的修改内容发给A作家,A作家再将B作家的修改添加到自己既有的修改上面!(--这应该就是合并)
如果A作家的修改的内容,B作家也进行了修改,那么就有A作家去决定改要谁的修改!(--这就是解决冲突)
git记住密码
建个文件,windows命名为_netrc,linux或mac命名.netrc

machine git.abc1.com
login username
password password
machine git.abc2.com
login username
password password

username是你的用户名,password是你的密码,
machine是你的git网站域名。
可以添加多个。
然后把这个文件放在个人目录下,
windows在C:\Users\XXXXXX目录下,
linux或mac在 ~/ 下

命令:
ssh-copy-id 密钥公共id 代码服务器的地址
例如:
ssh-copy-id -i ~/.ssh/id_rsa.pub code@192.168.0.6

注:
前提已经生成过密钥,生成密钥的命令:
ssh-keygen -t rsa -C 邮箱地址
例如:
ssh-keygen -t rsa -C "lisi@public.cn"

假设你有3个commit如下:

commit 3
commit 2
commit 1
其中最后一次提交commit 3是错误的,那么可以执行:

git reset --hard HEAD~1
你会发现,HEAD is now at commit 2。

然后再使用git push --force将本次变更强行推送至服务器。这样在服务器上的最后一次错误提交也彻底消失了。
值得注意的是,这类操作比较比较危险,例如:在你的commit 3之后别人又提交了新的commit 4,那在你强制推送之后,那位仁兄的commit 4也跟着一起消失了。

git_Windows_MinGW命令行如何复制粘贴?
1,选中 要 编辑 的
2,在 标题栏 -> 右键 -> 编辑 -> 复制/粘贴

还有一种方式

在标题栏 -> 右键 -> 属性 -> 快速编辑模式勾上。
然后就能够左键选中,右键复制,右键粘贴

Git Bash,有如下命令可以做到复制:

clip.exe < '待复制的文件'
例如:

clip.exe < ~/.ssh/id_rsa.pub
这样,你的ssh public key就复制到粘贴板里了

使用shift + insert应该是可以粘贴的,至于复制,应该可以配置为选中即复制。

另外在推荐一个windows下的命令神器:http://conemu.github.io/ -- tab标签,各种快捷键,还有各种配色很全很方便 -- 更重要地是,你就可以使用你熟悉的Ctrl+C/V了

分支和标签就是简单的文件(基本上是这样),包含指向该提交的SHA-1哈希值 所有的分支指针都保存在.git/refs/heads里,HEAD在.git/HEAD里,而标签保存在.git/refs/tags git checkout -b myfeature origin/myfeature 在远端服务器上删除一个分支(注意分支名前面的冒号) git push origin :twitter-experiment 查看本地分支和远端分支的差异:

$ git diff master..john/master git branch -m twitter-experiment 
$ git branch -m feature132 twitter-experiment 如果你只指定了一个分支参数,就会重命名当前分支
$ git stash
# 做点其他事情...
$ git stash pop 许多人建议使用git stash apply来代替pop,不过如果这样做的话最后会遗留一个很长的储藏列表。而“pop”会在全部加载后自动从堆栈中移除。 查看每次提交的具体改动$ git log -p  找特定提交者git log --author=Andy git log --since=2.months.ago --until=1.day.ago --author=andy -S "something" --all-match git log origin/master..new
# [old]..[new] - 所有你还没有推送的提交  轻松地取消改动:

$ git reset HEAD lib/foo.rb git commit --amend
这会取消最后一次提交git checkout --lib/foo.rb 找出来谁改动了某个文件里的某行代码会很有用 git gui blame FILE git count-objects -v 

Git 2.x 默认的是 simple,意味着执行 git push 没有指定分支时,只有当前分支会被 push 到你使用 git pull 获取的代码。  而对于 simple ,请输入:git config --global push.default simple
设置sshkey后还要用户密码
编辑项目目录下的.git/config文件
找到:
[remote "origin"]
    url =https://github.com/hit9/hit9.github.com.git
    fetch = +refs/heads/*:refs/remotes/origin/*
把url处改成ssh地址:

[remote "origin"]
    url =git@github.com:hit9/hit9.github.com.git
    fetch = +refs/heads/*:refs/remotes/origin/*
url是 https的时候会采用用户名认证. 是ssh地址的时候才会采用ssh认证

多个 github 账号,怎样配置对应的 SSH key
使用 ssh config(ssh_config Recipes). 在 .ssh 目录下新建一个 config 文件,配置对应不同 Host 使用不同的 key. 例如:

Host gitcafe.xxx
HostName gitcafe.com
User git
IdentityFile ~/.ssh/id_rsa_gitcafe_xxx

Host gitcafe.yyy
HostName gitcafe.com
User git
IdentityFile ~/.ssh/id_rsa_gitcafe_yyy

Host github.xxx
HostName github.com
IdentityFile ~/.ssh/id_rsa_github_xxx
# 此行是代理配置,请无视
ProxyCommand ~/.ssh/socksproxywrapper.sh %h %p
比如 id_rsa_github_xxx 是你在 github 上 xxx 用户的 key, 就可以使用

git clone git@github.xxx:xxx/project.git
这样的方式来拉取 github 上的项目。
lovecn commented 9 years ago

hexo博客http://zipperary.com/2013/05/28/hexo-guide-1/

lovecn commented 9 years ago

http://info.9iphp.com/25-git-advance-skills/ 25个 Git 进阶技巧

lovecn commented 9 years ago

Git 参考手册http://itmyhome.com/git/inspect.html