Final note added to the top of my reply : This is a lengthy response with quite a few steps… take your time! 
Hi,
I saw this last night but was fairly tired and didn’t think I could give my best response, so waited until this morning, sorry for the delay.
Well done for persevering with Git / GitHub, the more you use it the more straight forward it will become. If you are using the console and typing in the commands I would recommend having a look at a GUI client at some point as this will make things easier (GitKraken is free and seems fairly good, although there are others too).
One minor issue I had was that I don’t think you have included the project files in your repo, so I wasn’t able to just open it in Unity, no biggy, it was only the code file I really needed to see, so I created a copy of the Text101 project at this end and then swapped out the TextController.cs and scene files with yours to get it up and running. 
I don’t have the steps to repeat the problem you have explained above, so I’ve had a poke around.
TextController.cs;
- You have a trailing comma in your States enumeration after the last item.
- You have 53 States values, yet only 19 corresponding methods. It might be better to add them as you need them to avoid leaving items you don’t need/use (e.g. States.freedom)
Playing the Game / Reproducing the Error;
- I chose to look at the mirror, took the mirror, then looked at the lock - I died.
- Restarted
- I chose to look at the lock, it told me immediately that I had entered the wrong code, it was now broken, and I died in my cell.
- Restarted
- I looked at the sheets, tore some off to make the bandage, took the mirror, looked at the locked, it told me immediately that I had entered the wrong code, it was now broken, and I died in my cell.
Following the code through, that is because of this method;
void lock_1a()
{
text.text = "Looking in the mirrors reflection you see crusty brown fingerprints on the " +
"numbers '1' and '0'... as well as the surrounting panel. \n\n" +
"Press L to enter a 3 digit keycode. ";
string attemptedCode = securityPanel.text;
if (attemptedCode == secureCode) {myState = States.freedom;}
else {myState =States.death_0;}
}
Specifically, the bottom if statement, as soon as this state becomes true you are checking to see whether the attemptedCode is equal to the secureCode, which it can’t because the player hasn’t been given an opportunity to enter anything yet. Although you are checking within the Update() method to see if C has been pressed but the above method fires and puts us into the death state, before we even get chance to read the writing, or realistically have chance to press C.
So, what do we do… well, we need a way of stopping the security code validation firing before we want it to. The clue here is in your story text, “Press L to enter a 3 digit keycode.”, lets use that!
void lock_1a()
{
text.text = "Looking in the mirrors reflection you see crusty brown fingerprints on the " +
"numbers '1' and '0'... as well as the surrounting panel. \n\n" +
"Press L to enter a 3 digit keycode. ";
// activate the keycode data entry
if (Input.GetKeyDown(KeyCode.L))
{
securityPanelContainer.SetActive(true);
}
}
So, if they get to this state and press the L key we can set the securityPanelContainer as active, thus making it appear. Great!
But hang on, lets see if we are setting it to appear anywhere else also… Yes! In your first story item, in this method;
void cell_0()
{
text.text = "Disoriented, you wake up in a cell with not a sound to be heard. " +
"Your surroundings dictate that escape is essential for your survival. " +
"There is a bed behind you made with filthy sheets, " +
"a mirrior on the wall, and a locked door.\n\n" +
"Press S to view Sheets, M to view Mirror, L to view Lock.";
if (Input.GetKeyDown(KeyCode.S)) { myState = States.sheets_0; } // checks out
else if (Input.GetKeyDown(KeyCode.M)) { myState = States.mirror_0; } //
else if (Input.GetKeyDown(KeyCode.L)) { myState = States.lock_0; securityPanelContainer.SetActive(true); } // container is now set to active and appears
}
So, that bottom else if statement, when they view the lock without having the right items. But now that we are setting it to appear in the right place we can remove this, so, update this method to reflect this;
void cell_0()
{
text.text = "Disoriented, you wake up in a cell with not a sound to be heard. " +
"Your surroundings dictate that escape is essential for your survival. " +
"There is a bed behind you made with filthy sheets, " +
"a mirrior on the wall, and a locked door.\n\n" +
"Press S to view Sheets, M to view Mirror, L to view Lock.";
if (Input.GetKeyDown(KeyCode.S)) { myState = States.sheets_0; } // checks out
else if (Input.GetKeyDown(KeyCode.M)) { myState = States.mirror_0; }
else if (Input.GetKeyDown(KeyCode.L)) { myState = States.lock_0; }
}
Ok, so far so good, lets see if there is anywhere else we make the panel appear. Yes! In the Update() method;
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.C)) {securityPanelContainer.SetActive(true);} // container is now set to active and appears
// note I have not pasted the whole method here as it has all of your `if` statement logic`
}
Now, lets have a think, what we are saying here is “Every frame, regardless of the state we are in, if the player press C lets make the security panel appear”
We don’t need that now because we are going to check in the correct state for the key press (L now).
So lets remove that line completely from your Update() method. Gone!
Adding a quick horizontal break for a gasp of breath and a sip of my drink…
Ok, so now, if I run the game and choose these options, in this order;
S, T, M, B, M
I am reading the correct text and nothing is automatically submitted. I now press L and the InputField appears for me to type in.
I have noticed at this stage though that, as a player I have to now click into the InputField, assuming I could see it, so I click roughly on the green text… what might be better is to actually focus the InputField and get the cursor flashing away in there to give the player some direction… lets do that now as we have spotted it.
Back to your method lock_1a() and add this line after activating the panel;
securityPanel.Select();
So, you should now have;
void lock_1a()
{
text.text = "Looking in the mirrors reflection you see crusty brown fingerprints on the " +
"numbers '1' and '0'... as well as the surrounting panel. \n\n" +
"Press L to enter a 3 digit keycode. ";
// activate the keycode data entry
if (Input.GetKeyDown(KeyCode.L))
{
securityPanelContainer.SetActive(true);
securityPanel.Select();
}
}
Note, we are starting to build up a few security panel related statements here, it may be worth at a later stage refactoring these into their own method and simply call that after the key is pressed, lets leave them here for now as we have a lengthy post already! 
Running the game again and with the same sequence of key presses now shows the security panel and places the flashing cursor in the InputField. Great!
Lets now think about how we will get the game to respond to our user entering the code. We could several ways with this, we have already chosen an InputField solution but we could have the game check per key press, or, once the code is entered and the user confirms it. For now we will do the latter as it will require a little less validation and is therefore a little easier to implement, but you could update this later to make it seem much more like pressing buttons on a real keypad.
You already have the following method, but it isn’t being used at the moment for anything, lets hijack it!
public void CheckSecurityCode()
{
string attemptedCode = securityPanel.text;
if (attemptedCode == secureCode)
{
text.text = "The code is correct, the door opens!";
}
else
{
text.text = "The code is wrong! Bells are ringing... you have alerted the guards!";
}
}
As it stands it is doing some validation, but if we leave it to set text.text this will instantly get changed by the Update() method because we haven’t set any different state here. That would suggest that changing the state here could be useful, and if we are going to change the state, the text would be changed by the corresponding method which handles the individual states, thus we don’t need to set the text here at all. Also, at the moment, your game logic allows for “correct code - move on” or “incorrect code - die”, as such, we can hide the security panel again in here too, because we won’t need it again after this point.
So, here we go…
public void CheckSecurityCode()
{
securityPanelContainer.SetActive(false); // hide the panel
string attemptedCode = securityPanel.text;
if (attemptedCode == secureCode)
{
myState = States.freedom_0;
}
else
{
myState = States.death_0;
}
}
As you can see, as soon as we arrive here, we hide the panel, then we check the value of the submitted code and set your state accordingly. The Update() method will then respond as usual based on this state and call the appropriate method.
The only bit we haven’t handled yet is how we get from entering the code, to calling this method as we didn’t call this method from within the key press logic of the lock_1a() method. We could try that, but we would run into problems with the frequency of Update() being run and which characters had been entered at that point by the user, until they were all entered your code wouldn’t be correct, so they would keep being sent down the incorrect route. What we need is some way of handling the “I’ve finished editing this InputField” event…
…and here it is;
securityPanel.onEndEdit.AddListener(delegate { CheckSecurityCode(); });`
Before we put this into your code, lets run through it so you know what its doing…
Firstly we have securityPanel that is your InputField.
Next we have onEndEdit, this is an Unity event
We then call the AddListener() method which enables us to add a delegate, a reference pointer to a method
Finally, the method itself which we want to call CheckSecurityCode()
So, in layman’s terms… “The game will be listening for the onEndEdit event, when it is triggered it will call our CheckSecurityCode method”.
onEndEdit is triggered by pressing Enter or by clicking outside of the InputField, both of these scenarios seem appropriate for our needs.
So where do we put this statement, well, its good practice to put your event listeners at the start of you code, however we want to set it for an component that we are going to find, therefore we want to make sure we have found it first.
Looking at our Start() method we call our Initialise() method, this is the method which gets a reference to our securityPanel, so seems like the best place to me.
private void Initialise()
{
secureCode = "100";
securityPanelContainer.SetActive(false); // container is now set it inactive and is hidden
securityPanel = securityPanelContainer.GetComponentInChildren<InputField>(); // grab the InputField
securityPanel.onEndEdit.AddListener(delegate { CheckSecurityCode(); });
}
Ok - that was a lot of reading… so, lets have some fun…
Run the game, use the key sequence, S, T, M, B, M, then, press L, the security panel appears. Type in anything other than 100, you’re dead!
Now try that again, but this time enter 100… in the Words of Mel Gibson in Braveheart… “Freeeeeeee-Dommmmmmm”…

Some additional tidying up could be useful at this point, you have a number of other methods where you have implemented the check to see if the attemptedCode == secureCode etc (lock_0(), lock_0a()), I think there was at least one method I spotted where you give the option for the game to restart by pressing X also, but without offering that as an option to the player.
I can see that in chapter two you have another scenario where you want to use a security lock. My suggestion would be to implement the above changes, and get your code committed again to source control when you know this part is working as you want.
Then I would considering refactoring out the SecurityPanel code I mention earlier in the lock_1a() method. Place these into their own method and call it. That way all of your initial state based methods are simply telling a story and waiting for key presses for options.
If you get that sorted (for chapter one), I would then commit this to source control again, you now have a clean playing field for chapter two.
There shouldn’t be any reason why you can’t use the same approach for the next secured door. You would need to update the CheckSecurityCode() method, as current it sets states that are only relevant for the first chapter.
It would also be good to spend some time on reviewing the access modifiers on your variables and methods. I know some of this was pasted in from my other code example, but worth doing so that you know what is accessible to what, e.g. private / public.
Hope this is all of use 
See also;