GitHub && Git Basic

一、git的三种状态

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

1)已修改表示你修改了文件但还没有提交到你的数据库中。

2)已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。

3)已提交表示数据已经安全保存到本地数据库中。

基本的 Git 工作流程如下:

  1. 在工作目录中修改文件。

  2. 暂存文件,将文件的快照放入暂存区域。

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

二、git命令行常用技巧

1、当无法查看完整内容时候并想要退出时候,可按q。

2、当无法退出时候,先按Esc键,再输入":q"+回车即可。

3、按Esc以后连续按两次大写Z即可退出

三、git常用指令

1、git clone git@10.4.5.123:reco/sample.git(路径) .  :将git克隆到当前目录下,注意在路径后面需要空格加一个点。所谓克隆:就是在当前目录下初始化一个" .git "文件夹(因此包含了git init这一个步骤),从远程仓库拉取所有数据放入" .git "文件夹,并从中读取最新版本的文件的拷贝。如果执行“git clone git@10.4.5.123:reco/sample.git MyFirstGit”,首先在当前目录下新建一个名为MyFirstGit的文件夹,拉取远程数据到MyFirstGit文件夹下。

2、git status(查看修改、暂存和提交状态):查看那些文件处于什么状态。在编辑或者删除了某些文件之后,将通过git status命令查看这些修改的文件是否有放入暂存区(git add .);查看是否有提交暂存区的修改(git commit -m "XXX")。如果打印内容为"nothing to commit, working tree clean" 说明已跟踪文件在上次提交后从未被更改过。该命令还显示了当前所在的分支,并告诉你这个分支同远程服务器上对应的分支没有偏离。git status 与 git log 所不同的是git status是查看当前修改、暂存和提交状态;git log是查看分支的提交状态。

3、git add:将你的修改文件放入暂存区。当你修改或者删除某些文件时,这些文件就处于未跟踪状态;未跟踪的文件意味着Git在之前的快照(提交)中没有这些文件;Git不会自动将之纳入跟踪范围,除非你明明白白告诉它“我需要跟踪该文件”。例如你修改了src文件夹下的work.py文件,并且要将这一个修改放入暂存区,需要键入指令"git add src/work.py";若要取消刚才的暂存操作,键入"git reset HEAD src/work.py"。当你删除或修改文件过多时,并想要将所有这些修改放入暂存区域时候,使用" git add . " 。

也可以再GUI得Line上直接点按,右击Stage Hunk for Commit:

4、git diff:查看尚未暂存的文件更新了哪些部分。" git diff "是用来比较 暂存区域快照中已存在文件对应工作目录中当前文件 之间的差异,显示具体修改内容,当前增加的文件不会显示(因为原来暂存区中没有该文件故无法比较),删除的文件会显示。若具体只想查看暂存区中" work.py "的修改差异,输入命令行" git diff work.py ";如果查看的是src文件夹中的work.py的修改差异应该输入"git diff src/work.py"。

5、git diff --cached (或 git diff -- staged ):查看暂存起来的变化。即在提交之前,查看上次提交与这次暂存区之间的差异。

6、git commit -m " MESSAGE ":将目前暂存区域内容提交,MESSAGE为提交信息。提交后它会告诉你,当前是在哪个分支(master)提交的,本次提交的完整 SHA-1 校验和是什么(463dc4f),以及在本次提交中,有多少文件修订过,多少行添加和删改过。 每一次运行提交操作,都是对你项目作一次快照,以后可以回到这个状态,或者进行比较。若跳过使用暂存区域," git commit -a -m "MESSAGE"将所有已跟踪过的文件暂存起来一并提交 "。

7、git log(查看分支提交状态):查看提交历史。如常用的" git log -p -3 "中" -p "用来显示每次提交的内容差异;其中" -3 "代表仅显示最近三次提交;在git fetch以后从远程拉取最新数据以后(注意git fetch不会修改当前工作目录中的内容),比较本地当前版本与远程(origin/develop)之间的区别(git log -p develop.. origin/develop)。日志的其他输出方式请参考官网。" git log --oneline "是以单行形式查看历史。" git log --oneline --graph --all "是会输出你项目的分支分叉情况。

8、git push [remote-name] [branch-name]:推送数据到远程仓库。如果在你推数据前,已经有其他人推送了若干更新,那你的推送操作就会被驳回。你必须先把他们的更新抓取到本地,合并到自己的项目中,然后才可以再次推送。

9、git fetch [remote-name]从远程仓库中拉取你本地仓库中还没有的数据,它并不会修改工作目录中的内容(区别于git pull)。运行完成后,你就可以在本地访问远程仓库中的所有分支,将其中某个分支合并到本地(merge)。fetch命令只是将远端数据拉到本地仓库,但并不会自动合并到当前工作分支。如果设置了某个分支用于跟踪某个远端仓库的分支,可以使用 git pull 命令自动抓取数据下来,然后将远端分支自动合并到本地仓库中当前分支。在日常工作中我们经常这么用,既快且好。多用git fetch少用git pull Git 少用 Pull 多用 Fetch 和 Merge - 技术翻译 - OSCHINA 社区

10、git stash会把所有未提交的修改(包括暂存的和非暂存的)都保存起来,用于后续恢复当前工作目录。比如下面的中间状态,通过git stach命令推送一个新的储藏,当前的工作目录就干净了。需要说明一点,stash是本地的,不会通过git push命令上传到git server上。实际应用中推荐给每个stash加一个message,用于记录版本,使用git stash save取代git stash命令。可以通过git stash pop命令恢复之前缓存的工作目录。

四、git分支结构

1、创建分支:创建一个可以移动的新的指针,git branch XXX。创建远程分支:一般先在本地创建分支,然后push到远程相对应的分支如git checkout -b [branch-name1] ---> git push origin [branch-name1] 。

2、切换分支:git checkout XXX。当切换分支的时候,Git会重置你的工作目录,使其看起来回到了你在那个分支上最后一次提交的样子。Git会自动添加、删除、修改文件以确保此时你的工作目录和这个分支最后一次提交的样子一模一样。git checkout -b XXX:创建完XXX后切换到XXX分支。例如git checkout -b 本地分支名 origin/远程分支名,git checkout -b develop origin/develop。

3、删除分支:git branch -d XXX。

4、合并分支:git merge [branch-name]。有时候会遇到冲突,如果在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改,Git就没法干净的合并它们。此时Git做了合并,但没有自动创建一个新的合并提交。Git会暂停下来,等待你去解决合并产生的冲突。在发生冲突的文件夹中手动解决冲突后,使用git commit -a -m " MESSAGE "上传最终修改版本即可解决冲突。

五、git stash本地储藏

(1)git stash save "save message"  : 执行存储时,添加备注,方便查找,只有git stash 也要可以的,但查找时不方便识别。

(2)git stash list  :查看stash了哪些存储

(3)git stash show :显示做了哪些改动,默认show第一个存储,如果要显示其他存贮,后面加stash@{$num},比如第二个 git stash show stash@{1}

(4)git stash show -p 显示第一个存储的改动,如果想显示其他存存储,命令:git stash show  stash@{$num}  -p ,比如第二个:git stash show  stash@{1}  -p

(5)git stash apply 应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即stash@{0},如果要使用其他个,git stash apply stash@{$num} , 比如第二个:git stash apply stash@{1} 

(6)git stash pop 命令恢复之前缓存的工作目录,将缓存堆栈中的对应stash删除,并将对应修改应用到当前的工作目录下,默认为第一个stash,即stash@{0},如果要应用并删除其他stash,命令:git stash pop stash@{$num} ,比如应用并删除第二个:git stash pop stash@{1}

(7)git stash drop stash@{$num} 丢弃stash@{$num}存储,从列表中删除这个存储

(8)git stash clear 丢弃stash@{$num}存储,从列表中删除这个存储

六、放弃修改

1、放弃Unstaged Changes

       本地修改了一堆文件,并没有使用git add到暂存区,想要放弃修改。Changes会在本地消失。单个文件的放弃修改:$ git checkout -- filename 注意需要加两个--,不写就变成了检出分支了;所有文件需放弃修改:$ git checkout . 将上一次commit的内容检出,本地的修改就没有了。如果使用Git-GUI的话,只要在Unstaged Changes区域中右击"Revert Line"或者"Revert Hunk"即可。

       此命令不会删除新建的文件,因为新建的文件还没加入git管理系统中,所以对git来说是未知,只需手动删除即可。

2、放弃Staged Changes

       Changes不会在本地消失。若已经使用了git add的缓存,可使用 $ git reset HEAD filename 放弃所有的缓存可以使用 git reset HEAD . 命令,使用该命令后会将所有的Staged Changes变为Unstaged Changes。如果使用Git-GUI的话,只要在Staged Changes区域中右击"Unstage Hunk/Line From Commit"即可。

3、放弃Commit

        本地通过git add & git commit 之后,想要撤销此次commit。$ git reset --hard commit_id(取消了commit ,取消了add,取消源文件修改) 这个id是你想要回到的那个节点,可以通过git log查看,可以只选前6位。如:git reset --hard 0fb2f90 :路径指定版本0fb2f90。(git reset --hard HEAD^ 回退至上一个版本)。注意完成这个操作后,就恢复到了上一次的commit状态,工作空间代码也随之删除。如果想要不删除工作空间改动代码,需使用:$ git reset --soft commit_id(取消了commit )、 $ git reset --soft commit_id(取消了commit ,取消了add)。git reflog :查看命令历史,以便确定要回到未来哪一个版本。

git reflog && git log

        git reflog 可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作)例如执行 git reset --hard HEAD~1,退回到上一个版本,用git log则是看不出来被删除的commitid,用git reflog则可以看到被删除的commitid,我们就可以买后悔药,恢复到被删除的那个版本。

七、git && github常见问题

1、git fetch与git pull之间的区别

        当 git fetch 命令从服务器上抓取本地没有的数据时,它并不会修改工作目录中的内容。 它只会获取数据然后让你自己合并。 然而,有一个命令叫作 git pull 在大多数情况下它的含义是一个 git fetch 紧接着一个 git merge 命令。 如果有一个像之前章节中演示的设置好的跟踪分支,不管它是显式地设置还是通过 clone 或 checkout 命令为你创建的,git pull 都会查找当前分支所跟踪的服务器的分支,从服务器上抓取数据然后尝试合并入那个远程分支。

要检查远程仓库与本地仓库之间的差异再选择合并的方法:

1、从远处获取最新数据到本地,但不修改工作目录中的内容(git fetch origin develop)

2、比较本地当前版本与远程(origin/develop)之间的区别(git log -p develop.. origin/develop)

3、把远程下载下来的代码合并到本地仓库中(git merge origin/develop)

参照文章:git fetch 的简单用法:更新远程代码到本地仓库

2、GitHub中如何删除项目仓库

  1. 点击进入你要删除的repository,点击右侧的Settings;
  2. 在该Repo的Settings页面最下方有Delete this repository 按钮,点击;

3、远程分支的创建

      1.创建本地分支

$ git checkout -b developocr

       2.push到远程服务器,远程分支与本地分支同名

$ git push origin developocr:developocr

4、GitHub克隆速度过慢

      (有时候不行) ----->   可先用码云进行管理!

      经常要clone github中的一些项目,无奈如果不爬梯子的话速度实在是龟速,经常1k/s,搜了下解决方法为改HOSTS大法。Windows下在C:/Windows/system32/drivers/etc/hosts;Ubuntu等linux系一般在/etc/hostsWindows下。

         在 C:\Windows\System32\drivers\etc\hosts添加下面内容

# GItHub
151.101.112.249 http://global-ssl.fastly.Net
192.30.253.112 http://github.com
151.101.44.249 github.global.ssl.fastly.net
192.30.253.113 github.com
103.245.222.133 assets-cdn.github.com
23.235.47.133 assets-cdn.github.com
203.208.39.104 assets-cdn.github.com
204.232.175.78 documentcloud.github.com
204.232.175.94 gist.github.com
107.21.116.220 help.github.com
207.97.227.252 nodeload.github.com
199.27.76.130 raw.github.com
107.22.3.110 status.github.com
204.232.175.78 training.github.com
207.97.227.243 www.github.com
185.31.16.184 github.global.ssl.fastly.net
185.31.18.133 avatars0.githubusercontent.com
185.31.19.133 avatars1.githubusercontent.com

         添加之后命令行刷新保存,各个平台的方法 Windows:ipconfig /flushdns;Ubuntu:sudo systemctl restart nscd;Mac:sudo killall -HUP mDNSResponder。

C:\Users\SLJ>ipconfig /flushdns

Windows IP 配置

已成功刷新 DNS 解析缓存。

5、SSH及其配置

        Secure Shell (SSH) 是一个允许两台电脑之间通过安全的连接进行数据交换的网络协议。通过加密保证了数据的保密性和完整性。SSH采用公钥加密技术来验证远程主机,以及(必要时)允许远程主机验证用户。github要求推送百代码的用户是合法的,所以每次推送时候都要输入账号密码,用度以验证你是否为合法用户知,为了省去每次都要输入密码的步骤,采用shh公钥,密钥也就是你说的sshkey来验证你是否为合法用户。

1、检查是否存在SSH Key( cd ~/.ssh ---> ls)

XXX@DESKTOP-NVBSSRM MINGW64 ~/.ssh
$ ls
id_rsa  id_rsa.pub  known_hosts

2、如果没有SSH key,则需要生成SSH Key

ssh-keygen -t rsa -C "邮箱地址"

3、获取SSH key

XXX@DESKTOP-NVBSSRM MINGW64 ~/.ssh
$ cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC5PZo/3BPgF9fX0aUCm+7J0aAiV/fGj8NWoVyBAlMu6v7CXB7GLCluBZdPUMUZpwlllv2/Fr1/8HvmOV9+fv5W5pIqu1B..............................................

4、在github上添加SSH key

github项目托管:

参考文章:如何使用 Git 和 GitHub 来管理自己的代码 如何使用 Git 和 GitHub 来管理自己的代码 - 简书

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值