- rollback git add . 【done】
手快,输入了git add命令。如何撤销?
git reset即可。
可以用git status检验。
目标:把最新的远程分支拉到本地
前提:本地已有远程仓库的某分支,即git已知道远程仓库的地址及密码
做法:git fetch origin master:temp-master. //把远程master分支拉到本地,且名字为temp-master。
引申:用git fetch; git merge代替git pull。Git pull的弊端是” 你的本地工作目录在未经确认的情况下就会被远程分支更新“。[
https://www.oschina.net/translate/git-fetch-and-merge ]
目标:比较分支;查看分支区别
做法:git difftool assitline master // 将会在meld内依次打开assitline与master有区别的文件。2视图,左右两侧分别是assitline与master的(请注意2视图文件与输入命令间对应关系)。
也可以比较远程或本地分支:git difftool assitline origin/assitline
Git difftool assitline origin/master
使用情境:上一次commit/ push之后做了更改,尚未add/commit。现在要转到另外一个分支上。Git会提示无法转出,因为还有更改未保存。然而,我不想将这些更改add/commit。可以使用git stash命令将这些更改暂存起来,后面再回到本分支,从暂存区恢复这些更改,回到转出分支之前的情况。
做法:
git stash // save更改至暂存区域,且将当前工作目录恢复至上一次commit/ push的版本。该命令之后你就可以转出本分支了。
git stash apply // 将更改恢复至当前工作目录
git stash -h //查看命令帮助
git checkout -- src/deformation/ClothMaskImage.cpp // 将该文件的修改丢弃。注意“--”左右两侧各一个空格。
目标:要将远程master合并至本地分支wb
原则:安全第一,不要在本地分支wb上做合并(而是在一个临时分支上做合并)。
思路:首先得到远程master拉到本地temp-master;然后在temp-master上合并wb;再在wb上合并temp-master,最后将wb push至远程wb。该思路的好处是合并操作在temp-master上进行,若失败不会对wb及远程master有任何影响。
做法:
git fetch origin master:temp_master // 将远程的master拉到本地,命名为temp-master
git checkout temp-master // 进入temp-master分支
git merge wb // 将wb merge到temp-master上。这时候git会提示有大量的冲突,要求手工解决冲突,且temp-master分支的名称变为“temp-master | MERGING”。
git mergetool // 调用你config的mergetool(meld)解决冲突
。。。 // 冲突解决之后git要求写merge log。它就是后面你在wb内做了合并后push到远程的message。一定不要带上temp-master。要写成这样:merge wb with master。
git checkout wb; git merge temp-master // 因为你已在temp-master上与wb做了合并,所以这里不必进行任何合并操作。git提示的消息是fastforward.
git status; git add .; git commit -m"merge wb with master."; git push origin wb. // 将与master合并后的wb分支push到远程仓库
git merge
不仅可以merge本地分支,还可以是远程分支。【注意,发现这样做merge结果错误!!!禁止这样与远程master merge】
git merge origin master //将origin/master merge至当前分支。
git merge origin/master //在家里用上面一句失败,用这句才正确。
1、列出所有远程主机
git remote
2、查看远程主机地址
git remote -v
3、查看指定主机的详细信息
git remote show <主机名>
4、添加远程主机
git remote add <主机名> <网址>
5、删除远程主机
git remote rm <主机名>
6、修改远程主机名
git remote rename <原主机名> <新主机名>
- 同一电脑上有多个项目,每个项目对应不同的远程仓库(阿云code上learnprogram仓库,Gitlab上imagedeformation仓库),在与远程传输数据时不会有任何影响。
与远程仓库通信需要使用远程主机地址。你在创建本地项目时已设置了主机地址(例如,使用如下命令git add remote
[email protected]:lisiwang/imagedeformation.git)。这个主机地址保存在每个项目内(而不是git的全局配置)。所以,你可以放心使用origin标识符,git是不会搞错的。
关键问题:ssh key之类的怎么搞?
现象:在.gitignore内添加了某文件,但git仍然track它,push它。
原因:该文件已存在远程仓库内。对已存在于远程仓库内的文件,你无法用.gitignore忽略它。
解决方法:在远程仓库上删除该文件。
git rm --cached learncv.opensdf // 将文件从远程仓库上删除
git commit -m "Delete learncv.opensdf file from repository"
[ref:
http://stackoverflow.com/questions/11628418/git-cant-ignore-suo-file ]
要删除文件夹及其内部分的文件,需要git rm -r --cached x64/release
[ref:
http://gitref.org/zh/creating/#clone ]
Git clone git@... Dir //
将远程仓库git@...的master分支克隆至本地名为Dir的文件内
Git clone -b assitline git@... Clone dir
//将远程仓库git@...的assitline分支克隆至本地名为dir的文件夹内 【注意:使用该命令后,系统会在当前目录下建立与git仓库同名文件夹并将git内容拉到该文件夹内】
- git merge binary file conflict
binary file没法像txt文件一样做编辑并用mergetool解决冲突。所以只能选择某一个版本(ours:cur branch; thires: the mereged branch)。
方法如下:
git checkout --ours trimImgBdry.v12.suo // 使用cur branch内的.suo文件,git会把suo置为cur branch内的版本;类似的还有git checkout --thires trimImgBdry.v12.suo,使用the mereged branch内的suo版本。
git add trimImgBdry.v12.suo // 将当前的suo文件(在这里是指上一命令得到的suo文件)add上。
[ref:
http://stackoverflow.com/questions/2089560/how-do-i-merge-a-binary-file]
当你试图合并两个分支时,如果顺着一个分支走下去能够到达另一个分支,那么 Git 在合并两者的时候,只会简单的将指针向前推进(指针右移),因为这种情况下的合并操作没有需要解决的分歧——这就叫做 “快进(fast-forward)”。
git checkout master // git会把master的内容覆盖到当前本地的工作目录内。
git checkout local-oec // 类似,只是变成了local-oec
http://www.open-open.com/lib/view/open1396404725356.html
只是简单地看了下,暂时用不到,所以没有实践。
可解决的问题:多个git项目使用同一项目。
思路:将某项目做为其它项目的子项目。
- 设置git帐户信息、生成SSHK;git config; ssh-keygen; ssh -T
首先,在机器上安装git;[git仅是一个本地软件,要想实现网络备份功能,还需要连接网上服输器]
然后,设置与网络服务器(github)的连接:
1)设置帐户信息:[请先省略这一步。如果不work再回头加上这一步]
git config --global user.name "xuekunguo" [user.name在哪里找?进到git里,你所有的项目都在user.name下,aliyuncode的user.name="coldly_burning".]
2)生成本地机器的SSHKey并添加至github个人帐户[这样你就能通过该机器与github帐户交互了]
安全起见,先备份C:\Users\bufonid内的.ssh文件夹(这个文件夹是你现有的sshkey; 若不存在.ssh文件夹,直接生成新的;若已存在,直接覆盖)
找到id_rsa.pub,将其中内容复制出来,并加到github帐户的ssh栏内。
3)测试sshkey添加成功
- 提交更改到远程仓库;git status; git add; git commit; git push; git log
1. 浏览所做的更改
git status
2. 将更改加入到本次提交
当输入"git status"时,您的更改会显示为红色。
git add 红色的修改
git commit -m "提交的描述"
3. 提交您的更改到服务器
git push 远端 分支名称
在使用github做为网络仓库时,远端是是:origin。
因为前面已经将origin定义成了github:FabRigPaper-ChinaGraph。
4. show log
命令:git log 默认不加参数,git日志会按照最新的日期从上往下显示 参数:-p 显示版本间的代码差异
-数字 显示部分的提交
-哈希值 显示指定的版本
为远程仓库建立新分支
首先,从远程仓库clone一份代码(至于从哪个分支,自己定)
然后,在本地建立新分支:git branch newbranch.
接着,切换至新分支:git checkout newbranch
最后,将新分支push至远程仓库:git push origin newbranch。远程仓库就出现了名为newbranch的新分支。
共有3种方法实现ignore。我们只用第一种方法(vim编辑.gitignore文件)。[
http://blog.csdn.net/benkaoya/article/details/7932370]
情境:已有本地项目(但无远程仓库),要将其push至远程仓库
思路:首先在gitlab/ github上建立与其对应的远程空仓库,然后将本地项目init为git本地仓库,最后将本地仓库push至远程仓库
做法:
1)在github上建立仓库“Sketch2Cut-EIPaper”。[github上仓库的名字与你本地文件夹的名字是否一致不重要]
2)建立本地文件夹并在里面加入文件:本地文件夹为“PaperGit”,里面加入"PaperGit.tex"文件及"Mat"文件夹。
3)在gitbash里move到本地文件夹里。
4)git init // 将该文件夹初始化为本地仓库。在PaperGit文件夹下会生成“.git”文件夹。
5)git status // 查看对项目做的变动,gitbash应该显示本地文件夹里所有的文件及文件夹。
6)生成并编辑.gitignore文件记录不上同步的文件及文件夹
7)git add .; git commit -m "message";
8)git remote add origin
https://github.com/xuekunguo/Sketch2Cut-EIPaper.git //为本地仓库指定对应的网络仓库
9)git push -u origin master // -u选项的意思:
http://stackoverflow.com/questions/5561295/what-does-git-push-u-mean
两种方法:
第一种方法[不推荐!因为合并失败会导致本地项目受污染]。
Git branch assitline // 进入要做合并的分支
Git fetch origin assitline // 将远程仓库的assitline拉到本地暂存区
git merge FEATCH_HEAD // 合并暂存区内的assitline与本地assitline
第二种方法[推荐使用!]
Git fetch origin assitline:temp-assitline // 将远程assitline拉到本地,并创建名为temp-assitline的分支
Git checkout temp-assitline // 进入temp-assitline
Git merge assitline // 将assitline merge到temp-assitline内
… // 解决冲突,输入log message
Git checkout assitline
Git merge temp-assitline // git将会以fastforward方式做合并。这一步执行完成后就实现了将remote与Local合并的目标
在git里,commit与push是两种完全不同的状态。
commit,将更改同步至本地仓库,要修改message、文件等,都好办。git log命令查的是本地仓库的log,即commit的东西。
push,将commit的内容同步至网络仓库,要修改message、文件等,麻烦很多(貌似根本无法修改)。
在git的世界里,本地仓库是重点,网络仓库是你为了备份本地仓库而设置的。
在实践中,只要做了小更改就commit,实现整块功能再push。[So commit early and commit often: you can tidy up later with rebase.]
清除commit的内容不仅会清除掉本地仓库内commit的内容,还会把本地文件清除掉(把本地文件还原至你commit之前的状态)!
我清除了commit的内容,导致最后一次所做的更改丢失!
[
http://www-cs-students.stanford.edu/~blynn/gitmagic/ch05.html#_8230_and_then_some]
1)修改最后一次commit的meassage
$ git commit --amend
进入linux文本编辑页面,编辑原先的message即可。
[请注意,只能当最后一次commit没有被Push时,这样做才有效。若已push过仍然这样做会导致不可预知的后果。]
2)修改最后一次同步的内容:我试过,没成功。我觉得没必要这样做,你将修改后的内容重新commit一次即可。
[
http://stackoverflow.com/questions/448919/how-can-i-remove-a-commit-on-github]
首先,清除最后一次的commit(将最后一次同步到本地仓库的内容清除):git rebase -i HEAD~1;将对应行的pick改为drop;保存并退出。
然后,清除最后一次的push(将最后一次同步到网络仓库的内容清除):git push origin +master
[注意:是更改commit message而不是commit的内容(那些文件)]
首先,将目标commit调出来:
$git rebase -i HEAD~10 // 将最后10次commit的内容调出
然后,进入vim界面,做相应编辑:找到目标commit,将其前对应行的pick改为reword,表示要更改其message,保存并退出(在这里edit message不管用)。
接着,系统自动进入目标commit的message更改界面;更改message,保存并退出。
最后,验证是否更改成功:git log。
前提:要合并的commit尚未push到远程仓库。
git rebase -i HEAD~10 // 打开最近10次commit的信息
在界面内将commit前的pick改为squash,保存并退出。git会压缩commit,若有冲突会提示修改,在修改的时候要注意保存最新历史,否则我们的修改就丢弃了。
如果要放弃压缩,git rebase --abort
网址上提示,要使合并commit生效,需要输入git add ., git rebase --continue。通过试验,发现没必要输入这两个命令。
最后,将修改Push上去:git push origin cutface
notice: 输入合并commit的message时,在界面最上方,且不要有回车!
git merge --abort // 回退到Merge之前的状态
- 自动merge,但装做有conflict,需要你的和工处理,这样你可以review你的merge
git merge --no-commit gxk-hotfix //此时你的bugfixshadow上
前提:git bash所在目录为assitline
git branch bh0 //将assitline已commit的 copy一份并建立名为bh0的分支。注意,使用公司gitlab过程中,有时候assitlineI有更改未add,会要求先commit更改。
git checkout bh0 //跳到bh0上
.... //编辑本地文件
git status;git add .;git commit -m””
git push origin bh0 // 建立远程仓库bh0,将本地bh0 push至远程仓库。
前提:已知远仓库ssh,目标文件夹没有与远程仓库对应的本地分支
思路:把远程仓库的某分支clone到本地,不能使用fetch,因为它要求本地已有远程仓库某分支。
2. git branch bodydeform // copy本地的master,得到新分支bodydeform
3. git checkout bodydeform // 转到bodydeform分支
4. git branch -d master // 删除本地的master分支
5. git push origin bodydeform // 在远程仓库上建立bodydeform分支并将本地bodydeform分支push至远程仓库
- 删除分支;git branch -D; git branch -d
git branch -d // 安全删除;若当前分支有更改未commit会提示
git branch -D // 强制删除;忽略更改,直接删除
git push origin --delete assitline // 删除远程仓库上名为assitline的分支(本地assitline分支不受影响)
[ref:
http://stackoverflow.com/questions/2003505/how-to-delete-a-git-branch-both-locally-and-remotely]
git有本地(local)与远程(remote)的区别。
你的git branch, git branch -d/-D, git add., git commit, git checkout都是针对本地工作区。除非你输入git push origin [分支名],否则你的这些操作不会同步到远程仓库,即你的github目录状态不会有任何改变。例如,命令git branch -d asstiline删除本地分支assitline,远程仓库里的assitline分支不受任何影响。命令git push origin --delete assitline会删除远程仓库里的assitline分支,而本地的assitline分支不受任何影响。
再举个例子,你checkout到master分支输入git merge assitline,将assitline merge至master分支。但远程仓库的master没有变化。要想将变化后的本地master同步至远远程仓库的master,需要输入命令git push origin master。
总之,git的工作目录分为本地,远程两个。在进行操作前,要确保本地与远程的工作目录一致。对本地操作了,还得将其同步至远程。
[ref:
http://gitref.org/zh/remotes/ 分享与更新项目. 对git工作原理解释得非常好!]
git checkout master
git checkout bh0
checkout只是用于在master及各分支上跳转,类似于更改当前目录。
[
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001375840038939c291467cc7c747b1810aab2fb8863508000 ]
git有3个指针;1)master指向主分支的最新状态(主分支的最后一次提交);2)dev指向非主分支的最新状态(用户创建分支时,系统自动创建dev,且一个分支一个dev),即非主分支的最后一次提交;3)head指向当前分支的最新状态(最后一次提交),只有主分支时,head与master指向相同,你移动至其它分支时,head也移至那个分支。
git通过移动指针实现“用户创建新分支,实现功能,合并至主分支,然后删掉新建分支“(本部分的链接里有图展示这个过程)。
注意:1. 如上过程的命令实现见开头链接;2. 因为创建、合并和删除分支非常快,所以
Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。[要养成好的工作习惯]
- github push时,给出提示:Warning: Permanently added the RSA host key for IP address '192.30.252.128' to the list of known hosts.
原因:github服务器增加了很多新IP。导致git提示warning。
只要IP地址在192.30.252.0与192.30.255.255之间就可以。
[
http://stackoverflow.com/questions/18265851/push-to-remote-on-github-pointed-to-a-new-server-ip-instead/18432574#18432574 ]
1)SSH认证,需要ssh key。ssh key要在本机上生成并设置github帐户的ssh key。ssh地址形如:
[email protected]:name/code.git。
[为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。当然,GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。]
2)HTTPS认证需要每次输入github的用户名与密码。密码验证是github网站的安全策略,所以输入的是github的用户名和密码。Https地址形如:https://github.com/hit9/hit9.github.com.git。
判断本地仓库使用的认证方式
法1:打开本地仓库的".git/config"文件,"url="字段的形式表明认证方式。
法2:git remote -v
修改本地仓库使用的认证方式
https与ssh地址可以在网络仓库上得到。
法1:修改本地仓库“.git/config”文件的“url=”字段。
法2:先清除,再设置origin url
git remote rm origin // 清除当前的origin
法3:重新设置origin url
重新设计了认证方式后第一次Push需要使用"-u":
git push -u origin master
[
http://stackoverflow.com/questions/5697750/what-exactly-does-the-u-do-git-push-u-origin-master-vs-git-push-origin-ma]
[
http://blog.csdn.net/wfdtxz/article/details/8678982 ]
- 现象:新建立的本地仓库内有txt文件,第一次add时,提示:warning: LF will be replaced by CRLF in .gitignore. The file will have its original line endings in your working directory.
原因:文件结束标志编码的问题。linux, windows, mac有不同的文件结束标志。
http://stackoverflow.com/questions/1967370/git-replacing-lf-with-crlf
解决方法:在windows下,将core.autocrlf置为false(no line-ending conversion is performed)。
git config --global core.autocrlf false # per-user solution
1. 整个项目不得超过1G,单个文件不得超过100MB。单个文件超过50MB会warning。[
https://help.github.com/articles/what-is-my-disk-quota/]
2. 大项目或大文件怎么同步?用git LFS技术。[
https://help.github.com/articles/versioning-large-files/]
1). you need to associate it with a large file in your repository.
2). 然后你就可以用git的命令同步大文件了。
[想要获取更大的空间与流量,请交钱!]
2.1 使用git lfs的方法:
1)确认已正确安装git lfs
$git lfs install
git lfs initialized
2)设置需要用git lfs同步的文件
$ cd Mat_for_Doc // 必需到文件所在的目录中去,否则无法track![
https://github.com/github/git-lfs/issues/991]
$ git lfs track "*.wmf" // associate tracked files with git-lfs
3)按git的方式add commit,push。这样被git-lfs track的文件用git-lfs方式同步,另外的文件用git方式同步。
在大家使用github的过程中,一定会碰到这样一种情况,就是每次要push 和pull时总是要输入github的账号和密码,这样不仅浪费了大量的时间且降低了工作效率。在此背景下,本文在网上找了两种方法来避免这种状况,这些 成果也是先人提出来的,在此只是做个总结。
1.1 创建文件存储GIT用户名和密码
在%HOME%目录中,一般为C:\users\Administrator,也可以是你自己创建的系统用户名目录,反正都在C:\users \中。文件名为.git-credentials,由于在Window中不允许直接创建以"."开头的文件,所以需要借助git bash进行,打开git bash客户端,进行%HOME%目录,然后用touch创建文件 .git-credentials, 用vim编辑此文件,输入内容格式:
touch .git-credentials
vim .git-credentials
https://{username}:{password}@github.com
1.2 添加Git Config 内容
进入git bash终端, 输入如下命令:
git config --global credential.helper store
执行完后查看%HOME%目录下的.gitconfig文件,会多了一项:
[credential]helper=store
重新开启git bash会发现git push时不用再输入用户名和密码
git是比svn更先进的版本控制软件,开源。
https://git-scm.com/是git的官方网站。包括的资源有:git原理的介绍(各种文字版本),各种操作系统上的git工具(windows下的,mac下的,。。。)。
msysGit is the development environment to compile Git for Windows. It is complete, in the sense that you just need to install msysGit, and then you can build Git. Without installing any 3rd-party software. msysGit is not Git for Windows; that is an installer which installs Git -- and only Git.
- msysGit is the msys+mingw environment + everything needed to compile Git yourself, on Windows.
- Git for Windows is exactly that: Git, compiled for Windows.
msysGit是一个项目,它使用MSYS(MinGW的一部分)在Windows本地平台上编译出“Git for windows”。
msysGit发行的“Git for Windows”二进制文件(我下过的是“Git-2.8.1-64-bit.exe”)是Windows下的官方发行版本。
msysGit项目也发行“msysgit”二进制文件,这个二进制文件是构建“Git for Windows”的完整开发环境。
如果你只需要在Windows上使用Git,那么你从git-scm.com下载“Git for Windows”即可。
注意:Git for Windows往往被称为“preview”版本,因为msysGit项目组并不对它提供完整的支持。然而从个人体验来说,Git for Windows已经非常成熟、绝对稳定了,所以使用上是没有问题的。
最后,“Git Bash”是包含在“Git for Windows”发行包(更精确的说,是与底层MSYS一起打包)中的命令解释器。之所以需要这个Bash,是因为很多Git命令实际上是shell script,Bash负责对这些命令进行解释运行,同时,也正是因为Bash中间层的存在,Git才能完全兼容的运行在Windows上。即使你没有把 Git可执行文件加入PATH环境变量,Git也可以正常工作。但建议把Git可执行文件加入PATH,这样可以从其他的shell中使用Git,比如 cmd.exe或PowerShell。
gitbash是windows下的命令行工具,基于msys gun标准的开源软件。同理,在linux与mac下也有类似的工具(至于叫什么,我不清楚)。
github是个git仓库服务器,供大家免费使用。
github的介绍:GitHub 是最大的 Git 版本库托管商,是成千上万的开发者和项目能够合作进行的中心。 大部分 Git 版本库都托管在 GitHub,很多开源项目使用 GitHub 实现 Git 托管、问题追踪、代码审查以及其它事情。 所以,尽管这不是 Git 开源项目的直接部分,但如果想要专业地使用 Git,你将不可避免地与 GitHub 打交道,所以这依然是一个绝好的学习机会。
http://stackoverflow.com/questions/14243397/what-are-gits-merge-strategies
- What is the difference between Git bash and Git shell
For the main part of your question:
Git Bash and Git Shell are two different command line programs which allow you to interface with the underlying git program. Bash is a Linux-based command line (which has been ported over to Windows) while Shell is a native Windows command line. You can use either of them. They'll just have different auxiliary commands, for example Bash has "ls" instead of "dir".
https://www.quora.com/What-is-the-difference-between-Git-bash-and-Git-shell
git commit后提示:please tell me who you are
run
git config --global user.name "your Name"
出错原因:该本地工作目录未存储远程仓库的user.email, user.name。另外一个原因,很早以前设置了user.email与name,时间久了失效了。
解决方案:你需要按git的提示设置两个信息。
git config user.email // 查看你设置的user.email
git config --global user.name guoxuekun // 设置user.email
git config user.name // 查看你设置的user.name
https://zhidao.baidu.com/question/1691315328138129468.html
git fetch origin master c0316453bbc276616cf84eba8d1ceccf0322e581:master-03janpre
[格式: git fetch origin [branchname] [版本号]:[本地分支名]]
版本号的获取方法:git log;字符串“commit”右侧的一串数字与英文混合字符串。
gitlab的分支右侧会有两个数字,以竖线“|”分隔。左边数字表示master领先当前分支的版本数,右边数字表示当前分支领先master的版本数。
3视图,如何合并。
当左右都是添加的东西,且将左右视为只能取一个时,如何操作,使得将左右都添加进来。
如上情况,有时候左右会有重复部分, 如何去重添加?
【ref:
http://stackoverflow.com/questions/34119866/setting-up-and-using-meld-as-your-git-difftool-and-mergetool keywords: using Meld as your git difftool and mergetool】
http://gitref.org/zh/remotes/
中文git网站,给出20个最常用的命令
【ref:
http://blog.csdn.net/mypotatolove/article/details/40152399】
注意:1. 你改了哪个快捷方式,哪个快捷方式打开后去你的路径。git bash可以有多个快捷方式。这样你可以定义进入不同路径的git bash快捷方式。
2. 将更改路径后的git bash添加到任务栏:在“开始菜单 | Git | git bash”上更改起始路径,把它拉到任务栏上。